引言:网上的代码多多少少都有点问题,所以自己写了一个。
问题:贪心算法背包问题
假设有n种宝物,每种宝物i对应价值为vi,重量wi,毛驴只能运载重量为m的宝物。每种宝物只能拿1件,可分割。如何使得毛驴运走的宝物价值最大?
贪心策略:
1)每次挑选价值最大的宝物装入背包,得到的结果是否最优?
2)每次挑选重量最小的宝物装入背包,得到的结果是否最优?
3)每次挑选单位重量价值最大的宝物,价值是否最高?
算法设计
贪心算法背包问题
1)数据结构及初始化。
- 计算性价比
- 结构体item用于存储宝物的重量、价值和性价比
- 变量sum用于存储毛驴当前能够运走的最大价值
- 按照性价比进行降序排序
2)贪心策略:
每次挑选性价比最大的宝物
实现代码:
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct item_type
{
char name;
float weight;
float value;
float per_item_value;
float rate;//使用率
} item;
bool cmp(item &a, item &b)
{
return a.per_item_value > b.per_item_value;
}
int main()
{
int n;//N个物品
float c;//背包容量为c
cout << "输入物品件数和背包容量:" << endl;
cin >> n >> c;
cout << "依次输入每件物品的价值和重量:" << endl;
item *baowu;
baowu = new item[n];
for (int i = 0; i < n; i++)
{
baowu[i].name = 65 + i;
cin >> baowu[i].value >> baowu[i].weight;
baowu[i].per_item_value = baowu[i].value / baowu[i].weight;//计算性价比
baowu[i].rate = 0;//初始化使用率
}
sort(baowu, baowu + n, cmp);
float sum = 0;
int j = 0;
for (j = 0; j < n; j++)
{
if (baowu[j].weight <= c)
{
baowu[j].rate = 1;
sum += baowu[j].value;
c -= baowu[j].weight;
cout << "重量为:" << baowu[j].weight << "价值为:" << baowu[j].value << "的物品被放入了背包,放入比例为:" << baowu[j].rate << endl;
}
else
break;
}
//物品没装完
if (j < n)
{
baowu[j].rate = c / baowu[j].weight;
c -= baowu[j].rate * baowu[j].weight;
sum += baowu[j].rate * baowu[j].value;
cout << "重量为:" << baowu[j].weight << "价值为:" << baowu[j].value << "的物品被放入了背包,放入比例为:" << baowu[j].rate << endl;
cout << "背包剩余容量为:" << c;
cout << "总价值:" << sum;
}
}
请注意C++中结构体typedef struct / struct的使用区别,具体可百度!
请点个免费的赞吧!