#include<iostream>
#include<string.h>
using namespace std;
//0-1背包问题,n种物品和一背包,物体i的重量是w[i],其价值为v[i],背包容量c。
//m(i,j)是背包容量为j,可选物品为1,...,i时的背包问题的最优值,用m[][]来存储m(i,j)的相应值 ,m[n+1][c+1]
//template<typename Type>
void Knapsack(int v[],int w[],int c,int n)
{
int m[n+1][c+1];
int* mm=&(m[0][0]);
memset(mm,0,(n+1)*(c+1));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=c;j++)
{
if(w[i]<=j)
{
if(m[i-1][j]<m[i-1][j-w[i]]+v[i])
{
m[i][j]=m[i-1][j-w[i]]+v[i];//第i个分配
}
else
{
m[i][j]=m[i-1][j];//第i个不分配
}
}
else
{
m[i][j]=m[i-1][j];//空间不足
}
}//endfor
}//endfor
cout<<m[n][c]<<endl;
}
int main()
{
int c=6;
int n=3;
int w[4]={0,2,4,3};//物品质量
int v[4]={0,2,1,5}; //物品价值
Knapsack(v,w,c,n);
return 0;
}