运用贪心算法,每次挑选目前单价最高且重量未超过背包剩余容量的物品。补全以下代码#include <iostream.h> #include <stdio.h> typedef struct { char name[16]; // 名称 double p; // 价值 double w; // 重量 double r; // 单价 }good; int main() { int n, i, j, k; good *G, temp; double C; // 存储当前背包容量 double value; // 背包当前所装物品总价 freopen("Knapsack.in", "r", stdin); freopen("Knapsack.out", "w", stdout); cin>>n; cin>>C; G = new good[n]; for(i=0; i<n; i++) { cin>>G[i].name; cin>>G[i].p; cin>>G[i].w; G[i].r=G[i].p/G[i].w; } //************************************************ //================================================= cout<<"Total price: "<<((int)(100*value+0.5))*0.01<<endl; return 0; }
时间: 2023-11-12 17:06:35 浏览: 58
贪心算法0-1背包问题(算法实验代码).pdf
补全的代码如下:
```c++
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef struct {
char name[16]; // 名称
double p; // 价值
double w; // 重量
double r; // 单价
} good;
// 比较函数,用于排序
bool cmp(good a, good b) {
return a.r > b.r;
}
int main() {
int n, i, j, k;
good *G, temp;
double C; // 存储当前背包容量
double value = 0; // 背包当前所装物品总价
freopen("Knapsack.in", "r", stdin);
freopen("Knapsack.out", "w", stdout);
cin >> n;
cin >> C;
G = new good[n];
for(i = 0; i < n; i++) {
cin >> G[i].name;
cin >> G[i].p;
cin >> G[i].w;
G[i].r = G[i].p / G[i].w;
}
// 按照单价从高到低排序
sort(G, G + n, cmp);
// 按照贪心算法选择物品
for(i = 0; i < n; i++) {
if(G[i].w <= C) { // 若当前物品可以放入背包
C -= G[i].w; // 更新背包容量
value += G[i].p; // 更新背包所装物品总价
} else { // 若当前物品无法放入背包
value += G[i].r * C; // 将背包剩余容量全部用于装当前物品
break;
}
}
// 输出结果
cout << "Total price: " << ((int)(100 * value + 0.5)) * 0.01 << endl;
return 0;
}
```
代码中使用了 `sort` 函数进行排序,需要添加头文件 `algorithm`。在选择物品时,如果当前物品无法放入背包,则将背包剩余容量全部用于装当前物品,这是贪心算法的核心思想之一。最后输出结果时,使用了四舍五入的方法,即将数值乘以 100 后加上 0.5,再取整数部分,最后除以 100。
阅读全文