#include<stdio.h>
#define n 20
#define m 50
//#define s 2000
void knap_bag(int *c,int *w)
{
int f[n+1][m+1];//i+1件物品,m为容量
int i,j;
//int s;
for(i=0;i<=n;i++)//初始化
{
for(j=0;j<=m;j++)
{
f[i][j]=0;
}
}
//f[i][j]=max{f[i-1][j],f[i-1][j-c[i]]+w[i]}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(c[i]<=j)
{
if(f[i-1][j-c[i]]+w[i]>f[i-1][j])
{
f[i][j]=f[i-1][j-c[i]]+w[i];//选择该菜
}
else
f[i][j]=f[i-1][j];//不选择该菜
}
else
f[i][j]=f[i-1][j];//容量不足
}
}
printf("最优解:\n");
//
if(f[n][m]<=s)
printf("%d\n",f[n][m]);
//由那个菜组成
int temp_wei=m;
int x[n+1]={0,0,0,0};
for(i=n;i>0;i--)
{
if(f[i][temp_wei]==f[i-1][temp_wei])//最后选择的物品一定是最大的
{
x[i]=0;
}
else
{
x[i]=1;
temp_wei=c[i];
}
}
printf("应点的菜为:");
for(i=0;i<=n;i++)
{
if(x[i])
{
printf("第 %d 件",i);
}
}
printf("\n");
}
int main()
{
//int s=25;
int c[6]={2 3 4 5 6 24};//物品质量
int w[6]={0,6,3,4,5,4}; //物品价值
return 0;
}