背包问题(贪心法)
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;
}
分析:单价越高,放的越多,放进的价值越高。按照物品的单价排序,先放入单价高的,再放入单价低的。
#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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性