// 动态规划解决01背包问题
#include <iostream>
#include <iomanip>
//问题描述 五个物体 背包容量W=17
//体积数据 v[5]={3,4,7,8,9}
//价值数据 w[5]={4,5,10,11,13}
using namespace std;
void fn(int k,int m);
int w[6]={0,4,5,10,11,13};//价值
int v[6]={0,3,4,7,8,9};//体积
int x[6];
int a[6][18];
int i,j,k,m;
int main ()
{
//初始化 第0行0列赋值为0
for ( i=0;i<=5;i++) a[i][0]=0;
for ( j=0;j<=5;j++) a[0][j]=0;
for ( i=1;i<=5;i++) //i表示第几个物品
{ for (j=1;j<=17;j++) //j表示容量大小
{
if (v[i]>j)
a[i][j]=a[i-1][j];
else
a[i][j]=(a[i-1][j]>a[i-1][j-v[i]]+w[i])? a[i-1][j]:a[i-1][j-v[i]]+w[i];
}
}
//输出数据表用于观察
for ( i=0;i<=5;i++) //i表示第几个物品
{
for (j=0;j<=17;j++) //j表示容量大小
{ cout<<setw(3)<<a[i][j];}
cout<<endl;
}
//找出装入的物体,输出到x[]
i=5;
j=17;
while (i>=0&&j>=0)
{
if (a[i][j]==a[i-1][j])
{
x[i]=0;
i--;
}
else
{
x[i]=1;
i--;
j=j-v[i];
}
}
//输出x[]
cout<<endl;
for (int i=1;i<=5;i++)
cout<<x[i]<<" ";
return 0;
}