版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/arthu6/article/details/83447676
问题描述:7个物品,重为{2,3,5,7,1,4,1},价值为{10,5,15,7,6,18,3},背包容量W=15,求最优解。
思路:将物品按单重价值降序排列,装满为止。
C++代码:
#include<iostream>
#include<iomanip>
using namespace std;
int KnapSack(int w[],int v[],int n,int C)
{
double x[7]={0};
int i;
int maxValue=0;
for( i=0;w[i]<C;i++)
{
x[i]=1;
maxValue+=v[i];
C-=w[i];
}
x[i]=(double)C/w[i];
maxValue+=v[i]*x[i];
cout<<"取物信息:";
for(i=0;i<7;i++) cout<<x[i]<<" ";
cout<<endl;
return maxValue;
}
int main()
{
int w[7]={2,3,5,7,1,4,1};
int v[7]={10,5,15,7,6,18,3};
int C=15;
int V;
for(int i=0;i<7;i++)
for(int j=i+1;j<7;j++)
{
if(v[i]/w[i]<v[j]/w[j])
{
int tv,tw;
tv=v[j];v[j]=v[i];v[i]=tv;
tw=w[j];w[j]=w[i];w[i]=tw;
}
}
cout<<"单重价值降序价值:";
for(int i=0;i<7;i++)
cout<<setw(2)<<v[i]<<" ";
cout<<endl;
cout<<"单重价值降序重量:";
for(int i=0;i<7;i++)
cout<<setw(2)<<w[i]<<" ";
cout<<endl;
V=KnapSack(w,v,7,C);
cout<<"最优解:"<<V<<endl;
return 0;
}
截图: