#include<stdio.h>
#include<stdlib.h>
int m[6][11];
void Traceback(int w[],int c,int n,int x[])
{
int i,j;
for( i = 1; i < n ; i++)
{
if(m[i][c] == m[i+1][c])
x[i] = 0;
else { x[i] = 1; c = c-w[i];}
}
x[n] = (m[n][c]) ? 1:0;
for(j = 1; j <= n; j++)
printf("%d ",x[j]);
printf("\n");
}
void Knapsack(int *value , int *weight , int contain , int n )
{
int jmax,i,j;
int x[6] = {0};
jmax = getmin(weight[n] - 1 , contain);
//初始化最后一行
for(j = 0; j <= jmax; j++) m[n][j] = 0;
for(j = weight[n] ; j <= contain ; j++) m[n][j] = value[n];
printf("hello i am here....\n");
for(i = n-1; i > 1; i--)
{
jmax = getmin(weight[i] - 1 , contain);
for(j = 0; j <= jmax ; j++)
m[i][j] = m[i+1][j];
for(j = weight[i]; j <= contain ; j++)
m[i][j] = getmax(m[i+1][j] , m[i+1][j-weight[i]]+value[i]);
}
m[1][contain] = m[2][contain];
if(contain >= weight[1])
m[1][contain] = getmax(m[1][contain] , m[2][contain - weight[1]]+value[1]);
printf("最大可装的总价值是%d\n",m[1][contain]);
Traceback(weight,contain,n,x);
}
int getmin(int x,int y)
{
if(x > y)
return y;
else return x;
}
int getmax(int x,int y)
{
if(x > y)
return x;
else return y;
}
int main()
{
int n = 5;
int contain = 10;
int weight[6] = {0,2,2,6,5,4};
int value[6] = {0,6,3,5,4,6};
Knapsack(value , weight , contain , n);
// Traceback(weight,contain,n,x);
return 0;
}