#include<stdio.h>
#define N 5
#define W 11
void knapsack01(int result[N + 1][W + 1], int w[N + 1], int v[N + 1]) {
int i, j;
for (i = 1; i <= N; i++) {
for (j = 1; j <= W; j++) {
if (j < w[i])
result[i][j] = result[i - 1][j];
else
result[i][j] = result[i - 1][j] > (v[i] + result[i - 1][j - w[i]]) ? result[i - 1][j] : (v[i] + result[i - 1][j - w[i]]);
}
}
}
void select(int result[N + 1][W + 1],int w[N+1],int v[N+1]) {
int n = N;
int bagw = W;
while (n > 0) {
if (result[n][bagw] == result[n - 1][bagw]) {
n--;
}
else {
printf("(%d,%d) ", w[n],v[n]);
bagw = bagw - w[n];
n--;
}
}
}
int main()
{
int w[N+1] = { 0.5,1 , 2 , 3 , 4 };
int v[N+1] = { 1000,1500,2000,3000 };
int result[N+1][W+1] = {0};
knapsack01(result, w, v);
printf("背包可容纳磅数为 %d,最大价值为 %d\n", W, result[N][W]);
printf("选择了:");
select(result, w,v);
return 0;
}