以下是根据动态规划的步骤求解一个最基本的01 背包问题最直接的做法
/*描述
有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W
的物品,求所有挑选方案中物品价值总和的最大值。
1 <= n <=50
1 <= wi <= 10
1 <= vi <= 50
1 <= W <= 10
输入
多组测试数据。
每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi。
输出
满足题意的最大价值,每组测试数据占一行。
样例输入
4 5
2 3
1 2
3 4
2 2
样例输出
7
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
<span style="color:#3333ff;">/*c[i][W]= 0 i=0或W=0
c[i][W]=c[i-1][W] wi>W
c[i][W]=max(c[i-1][W-wi]+vi, c[i-1][w])
*/</span>
int **knapsack(int N,int W,int *weight,int *value)
{
int **c=new int*[N+1];
for(int i=0;i<=N;i++)
{
c[i]=new int[W+1];
}
for(int i=0;i<=N;i++)
{
c[i][0]=0;
}
for(int i=0;i<=W;i++)
{
c[0][i]=0;
}
for(int i=1;i<=N;i++)
{
for(int w=1;w<=W;w++)
{
if(weight[i-1]<=w)//背包容量大于物品的容量
{
if(c[i-1][w-weight[i-1]]+value[i-1]>c[i-1][w])
{
c[i][w]=c[i-1][w-weight[i-1]]+value[i-1];
}
else
{
c[i][w]=c[i-1][w];
}
}
else
{
c[i][w]=c[i-1][w];
}
}
}
return c;
}
int main()
{
int N,W;
int weight[101],value[101];
int **c;
while(cin>>N>>W)
{
int i=0,j=0;
for(int k=0;k<N;k++)
{
cin>>weight[i++]>>value[j++];
}
c=knapsack(N,W,weight,value);
cout<<c[N][W]<<endl;
}
return 0;
}