您的位置:首页 > 编程语言 > C语言/C++

背包问题(贪心法)

2016-04-16 12:33 375 查看
设计程序实现背包算法,背包容量、物品数量、物品重量、价值通过界面设定。(物品可分割)

分析:单价越高,放的越多,放进的价值越高。按照物品的单价排序,先放入单价高的,再放入单价低的。

#include<iostream>
using namespace std;
class Knapsack{
public:
Knapsack(int maxSize,float cap,float *wei,float *prof){
n=maxSize;
m=cap;
w=wei;
p=prof;
}
void sort()
{
int max;
for(int i=0;i<n;i++){
max=i;
float a=p[max]/w[max];
for(int j=i+1;j<n;j++)//简单选择排序
{
float b=p[j]/w[j];
if(a<b){
float temp;
temp=w[j];
w[j]=w[max];
w[max]=temp;
float Temp;
Temp=p[j];
p[j]=p[max];
p[max]=Temp;
}
}
}
}
void GreedyKnapsack(float *x){
float u=m;
for(int i=0;i<n;i++) x[i]=0;
for(i=0;i<n;i++)
{
if(w[i]>u) break;
x[i]=1.0;
u=u-w[i];
}
if(i<n){
x[i]=u/w[i];
}
}
private:
float m,*w;//背包载重量,每个物品的重量
float *p;//n个物品的价值
int n;//物品个数
};
int main()
{
int n;
cout<<"请输入物品个数:"<<endl;
cin>>n;
float m;
float *x=new float
;
float *w=new float
;
float *p=new float
;
cout<<"请输入背包载重量:"<<endl;
cin>>m;
for(int i=0;i<n;i++)
{
cout<<"请输入第"<<i+1<<"个物品的重量和价值:"<<endl;
cin>>w[i]>>p[i];
}
Knapsack k(n,m,w,p);
k.sort();
k.GreedyKnapsack(x);
for(int j=0;j<n;j++)
{
cout<<"重量为:"<<w[j]<<"价值为:"<<p[j]<<"的物品取件数:——————"<<x[j]<<""<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++