背包问题
(Knapsack.cpp)
【题目描述】
给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。
【解题思路】
运用贪心算法,每次挑选目前单价最高且重量未超过背包剩余容量的物品。允许装入物品的一部分。
【输入】
输入Knapsack.in中第一行包含2个整数,前一个是物品的数目n,后一个为背包的最大容量;以下n行的每一行是某个物品的名称、金额和重量。
【输出】
输出Knapsack.out如输出样例,为价格最高的背包方案,即单价由大到小所装物品的清单。结果保存两位小数.
【输入输出样例1】
Knapsack.in |
Knapsack.out |
5 15.0 AAA 4.0 12.0 BBB 2.0 2.0 CCC 2.0 1.0 DDD 1.0 1.0 EEE 10.0 4.0 |
EEE:4.00Kg CCC:1.00Kg BBB:2.00Kg DDD:1.00Kg AAA:7.00Kg Total price:17.33 |
#include
#include
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=0; // 背包当前所装物品总价
scanf("%d",&n);//输入商品的数量
scanf("%lf",&C);//输入背包的最大容量
G = new good[n];
for(i=0; i=C)
{
printf("%s:%.2lfKg\n",G[i].name,C);
value+=G[i].r*C;
break;
}
else
{
printf("%s:%.2lfKg\n",G[i].name,G[i].w);
value+=G[i].p;
C-=G[i].w;
}
}
printf("Total price:%.2lf",((int)(100*value+0.5))*0.01);
return 0;
}