#include<stdio.h>
const int N = 4;
void Knapsack(int v[],int w[],int c,int n,int m[][10]);
void Traceback(int m[][10],int w[],int c,int n,int x[]);
int getMin(int a,int b);
int getMax(int a,int b);
int main()
{
int c=8;
int v[]= {0,2,1,4,3},w[]= {0,1,4,2,3};
int x[N+1];
int m[10][10];
printf("待装物品重量分别为:\n");
for(int i=1; i<=N; i++)
{
printf("%d ",w[i]);
}
puts("");
printf("待装物品价值分别为:\n");
for(int i=1; i<=N; i++)
{
printf("%d ",v[i]);
}
puts("");
Knapsack(v,w,c,N,m);
printf("背包能装的最大价值为:%d\n",m[1][c]);
Traceback(m,w,c,N,x);
printf("背包装下的物品编号为:\n");
for(int i=1; i<=N; i++)
{
if(x[i]==1)
{
printf("%d ",i);
}
}
puts("");
return 0;
}
void Knapsack(int v[],int w[],int c,int n,int m[][10])
{
int jMax = getMin(w[n]-1,c);
for(int j=0; j<=jMax; j++)
{
m[n][j]=0;
}
for(int j=w[n]; j<=c; j++)
{
m[n][j] = v[n];
}
for(int i=n-1; i>1; i--)
{
jMax = getMin(w[i]-1,c);
for(int j=0; j<=jMax; j++)
{
m[i][j] = m[i+1][j];
}
for(int j=w[i]; j<=c; j++)
{
m[i][j] = getMax(m[i+1][j],m[i+1][j-w[i]]+v[i]);
}
}
m[1][c] = m[2][c];
if(c>=w[1])
{
m[1][c] = getMax(m[1][c],m[2][c-w[1]]+v[1]);
}
}
void Traceback(int m[][10],int w[],int c,int n,int x[])
{
for(int i=1; i<n; i++)
{
if(m[i][c] == m[i+1][c])
{
x[i]=0;
}
else
{
x[i]=1;
c-=w[i];
}
}
x[n]=(m[n][c])?1:0;
}
int getMin(int a,int b)
{
if(a>=b)
return b;
else
return a;
}
int getMax(int a, int b)
{
if(a>=b)
return a;
else
return b;
}