동적 프로그래밍을 사용하여 0-1 배낭 문제를 해결하는 C++ 프로그램입니다. 0-1 배낭 문제에서는 각 항목에 가중치와 값이 있는 항목 집합이 제공됩니다. 총 무게가 주어진 한계 이하이고 총 값이 가능한 한 크도록 컬렉션에 포함할 각 항목의 수를 결정해야 합니다.
알고리즘
Begin무게와 값을 각각 가진 항목 집합을 입력 배낭 용량 설정 최대 두 개의 정수를 반환하는 함수를 만듭니다. 용량의 배낭에 넣을 수 있는 최대 값을 반환하는 함수를 만듭니다. Wint knapSack(int W, int w [], int v[], int n)int i, wt;int K[n + 1][W + 1]for i =0 to nfor wt =0 to Wif (i ==0 또는 wt ==0) Do K[i][wt] =0else if (w[i - 1] <=wt) 계산:K[i][wt] =max(v[i - 1] + K[i - 1][wt - w[i - 1]], K[i -1][wt])else K[i][wt] =K[i - 1][wt] return K[n][W] 함수를 호출하고 인쇄합니다. 종료
예시 코드
#include네임스페이스 std;int max(int x, int y) { return (x> y) ? x :y;}int knapSack(int W, int w[], int v[], int n) { int i, wt; 정수 K[n + 1][W + 1]; for (i =0, i <=n, i++) { for (wt =0, wt <=W, wt++) { if (i ==0 || wt ==0) K[i][wt] =0; else if (w[i - 1] <=wt) K[i][wt] =max(v[i - 1] + K[i - 1][wt - w[i - 1]], K[i - 1][중량]); 그렇지 않으면 K[i][wt] =K[i - 1][wt]; } } return K[n][W];}int main() { cout <<"배낭의 항목 수를 입력하세요:"; 정수 n, W; 신>> n; 정수 v[n], w[n]; for (int i =0; i > v[i]; 신>> w[i]; } cout <<"배낭 용량을 입력하세요"; 신>> W; cout < 출력
Knapsack에 있는 항목의 수를 입력하세요:4항목의 값과 무게를 입력하세요 0:1050항목 1의 값과 무게를 입력하세요 1:2060항목 2의 값과 무게를 입력하세요 2:3070항목의 값과 무게를 입력하세요 3:4090Knapsack의 용량을 입력하세요10040사전>