动态规划之0—1背包问题
分析:
背包容量为j,可选物品为i,i+1,…,n时0-1背包问题的最优值。
则建立计算p(i,j)的递归式如下:
参考代码如下:
#include<bits/stdc++.h>
using namespace std;
#define NUM 50
#define CAP 1500
int w[NUM];
int v[NUM];
int p[NUM][CAP];
void knapsack(int c,int n)//c是背包容量 n是物品数量
{
int jMax=min(w[n]-1,c);
for(int j=0;j<=jMax;j++) p[n][j]=0;
for(int j=w[n];j<=c;j++) p[n][j]=v[n];
for(int i=n-1;i>1;i--)
{
jMax=min(w[i]-1,c);
for(int j=0;j<=jMax;j++)
p[i][j]=p[i+1][j];
for(int j=w[i];j<=c;j++)
p[i][j]=max(p[i+1][j],p[i+1][j-w[i]]+v[i]);
}
p[1][c]=p[2][c];
if(c>=w[1]) p[1][c]=max(p[1][c],p[2][c-w[1]]+v[1]);
}
void traceback(int c,int n,int x[])
{
for(int i=1;i<n;i++)
{
if(p[i][c]==p[i+1][c]) x[i]=0;
else {x[i]=1;c-=w[i];}
}
x[n]=(p[n][c])?1:0;
}
int main()
{
int c,n;
int x[100];
cin>>c;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>w[i];
cin>>v[i];
}
knapsack(c,n);
cout<<p[1][c]<<endl;
traceback(c,n,x);
cout<<x[n];
}