//16.2-2 动态规划算法求解0-1背包问题
#include <iostream>
using namespace std;
#define W 50
#define N 3
int v[N+1]={0,60,100,120};//物品价值
int w[N+1]={0,10,20,30};//物品重量
int c[N+1][W+1]={0};//c[i][j]表示在剩余容量为j的情况下,对于物品1.....i所能达到的最大价值
int x[N+1]={0};
void Dynamic_Knapsack(int v[],int w[],int n,int weight)//求解最大价值
{
for(int j=0;j<=weight;++j)//
c[0][j]=0;
for(int i=1;i<=n;++i)
{
c[i][0]=0;
for(int j=1;j<=weight;++j)
{
if(w[i]<=j)//当还有还有剩余容量时
{
if(v[i]+c[i-1][j-w[i]]>c[i-1][j])//此时选择装入物品i
c[i][j]=v[i]+c[i-1][j-w[i]];
else//不装入物品i
c[i][j]=c[i-1][j];
}
else
c[i][j]=c[i-1][j];
}
}
}
void TraceBack(int c[][W+1],int w[],int weight,int n,int x[])//选择被选中的物品
{
for(int i=n;i>=1;--i)
{
if(c[i][weight]==c[i-1][weight])//物品i未被选中
{
x[i]=0;
}
else//物品i被选中
{
x[i]=1;
weight=weight-w[i];
}
}
}
void main()
{
Dynamic_Knapsack(v,w,N,W);
cout<<"The largest value is "<<c[N][W]<<endl;
TraceBack(c,w,W,N,x);
for(int i=1;i<=N;i++)
{
if(x[i]==1)
cout<<"Item "<<i<<" is selected!"<<endl;
}
cout<<endl;
}
算法导论答案 16.2-2 0-1背包问题的动态规划算法
最新推荐文章于 2021-11-16 18:19:15 发布