#include <iostream>
using namespace std;
void compute(int volume,int n,int w[],int p[],int value[][100])
{
for(int j=0;j<=volume;j++)
if(j>=w[0])
value[0][j]=p[0];
else
value[0][j]=0;
for( int i=1;i<n;i++)
{
for(int j=0;j<=volume;j++)
if( j>=w[i]&&value[i-1][j]<value[i-1][j-w[i]]+p[i])
value[i][j]=value[i-1][j-w[i]]+p[i];
else
value[i][j]=value[i-1][j];
}
}
void output(int value[][100],int w[],int p[],int n,int volume,int x[])
{
int i,sump=0;
int c=volume;
for(i=n-1;i>0;i--)
{
if(value[i][c]>value[i-1][c])
{
x[i]=1;
c-=w[i];
sump+=p[i];
}
else
x[i]=0;
}
if(value[n-1][volume]>sump)
{
x[0]=1;
}
else
x[0]=0;
}
int main()
{
cout<<"请输入背包的最大承受量:"<<endl;
int volume;
cin>>volume;
cout<<"请输入目前存在的物件的个数:"<<endl;
int n;
cin>>n;
int w[20],p[20];
for(int i=0;i<n;i++)
{
cout<<"请分别输入第"<<i+1<<"个物件的重量和价值:"<<endl;
cin>>w[i]>>p[i];
}
int value[100][100],x[100],sump=0;
compute(volume,n,w,p,value);
output(value,w,p,n,volume,x);
for(int i=0;i<n;i++)
{
if(x[i]==1)
{
cout<<"选取了第"<<i+1<<"个物体,它的重量是:"<<w[i]<<",价值为:"<<p[i]<<endl;
}
}
cout<<"总价值为:"<<value[n-1][volume]<<endl;
system("pause");
return 0;
}
C++ 动态规划0-1背包问题
最新推荐文章于 2024-04-01 20:21:48 发布