对于0-1背包问题还是要用动态规划的算法来实现,但是对于部分背包问题还是要用贪心算法,代码示例如下:
算法实现
#include <iostream>
using namespace std;
//n,物品个数,w 重量,v 价值,x 比例,M 最大容量,c背包容量
void Sort(int n,float *w,float *v)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n-i;j++)
{
float tem1=v[j]/w[j];
float tem2=v[j+1]/w[j+1];
if(tem1<tem2)
{
swap(w[j],w[j+1]);
swap(v[j],v[j+1]);
}
}
}
int main()
{
float w[1000];
float v[1000];
float x[1000];
int n;
float M;
cout<<"请输入物品的个数:" <<endl;
cin>>n;
cout<<"请输入背包的最大容量:"<<endl;
cin>>M;
cout<<"请输入每个物品的重量:"<<endl;
for(int i=1;i<=n;i++){
cin>>w[i];
}
cout<<"请输入每个物品的价值:"<<endl;
for(int i=1;i<=n;i++){
cin>>v[i];
}
cout<<"物品依次放入的比例为:"<<endl;
Sort(n,w,v);
int i;
double sum;
for(i=1;i<=n;i++)
x[i]=0;
float c=M;
for(i=1;i<=n;i++)
{
if(c<w[i]){
sum+=v[i]/w[i]*c;
break;
}
else{
sum+=v[i];
x[i]=1;
c=c-w[i];
}
}
if(i<=n)
x[i]=c/w[i]; //部分装下 ,所占比例
for(int i=1;i<=n;i++){
cout<<x[i]<<' '<<endl;
}
cout<<"总价值为:"<<sum<<endl;
return 0;
}