#include "stdafx.h"
#include<stdio.h>
#define ma 200
void main()
{
int v[ma],w[ma],x[ma],m[50][ma];
int i,j,cw,c,n,sp=0;
printf("请输入物品总数"); scanf("%d",&n);
printf("请输入背包容量"); scanf("%d",&c);
for(i=1;i<=n;i++)
{printf("请输入第%d物品的重量",i);scanf("%d",&w[i]);}
for(i=1;i<=n;i++)
{printf("请输入第%d物品的价值",i);scanf("%d",&v[i]);}
//边界条件
for(j=0;j<w[n];j++) m[n][j]=0;
for(j=w[n];j<=c;j++) m[n][j]=v[n];
//递推式应用
for(i=n-1;i>=1;i--)
for(j=0;j<=c;j++)
if((m[i+1][j]<(m[i+1][j-w[i]]+v[i]))&&(j>=w[i]))
m[i][j]=m[i+1][j-w[i]]+v[i];
else
m[i][j]=m[i+1][j];
for(i=n-1;i>=1;i--)
for(j=0;j<=c;j++)
printf("m[%d][%d]=%d\n",i,j,m[i][j]);
printf("\n\n\n\n\n\n");
cw=c;printf("c=%d",c);
for(i=1;i<=n-1;i++)
if(m[i][cw]==m[i+1][cw]) x[i]=0;
else {x[i]=1;cw-=w[i];sp+=v[i];}
if(sp<m[1][c]) {x[n]=1;cw-=w[n];}
else x[n]=0;
printf("i, wi, Vi, Xi\n");
for(i=1;i<=n;i++)
{
printf("%d,%d,%d,%1d\n",i,w[i],v[i],x[i]);
}
printf("w=%d, maxV=%d\n",c-cw,m[1][c]);
}