背包问题描述:
给定n个重量为w1,…wn,价值为v1,…vn 的物品和一个承重为W的背包,求这些物品中最有价值的一个子集,并且要能够装到背包中。
背包的承重为10,求能装到背包中的最有价值的子集。假设有物品如下表:
物品序号 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
物品重量 | 7 | 3 | 4 | 5 |
物品价值 | 42 | 12 | 40 | 25 |
物品的数据结构如下:
struct good{
float weight; //物品重量
float value; //物品价值
float average; //物品单位价值
int flag; //物品序号
}
问题解决思路:首先计算出每个物品的单位价值,即物品价值/物品重量。然后将物品按照物品单位价值由大到小进行排序,这里使用的是冒泡排序,随后将物品按单位价值的先后放入背包,每放入一件物品就计算一次背包的重量,直到剩余物品的重量都大于背包剩余的可容纳重量,此时背包中的物品即为最有价值的子集,背包中的物品的价值总和即为背包在承重范围内能装下的最大物品价值。
代码如下:
#include<stdio.h>
struct good{
float weight; //物品重量
float value; //物品价值
float average; //物品单位价值
int flag; //物品序号
}Cargo[10]; //物品
struct{
float bearing; //承重
float F; //价值
int goods[10]; //背包中的物品
}Bag;
void input(int s)
{
int num;
for (num = 0; num <s ; num++){
if (Cargo[num].weight <= Bag.bearing){
Bag.F += Cargo[num].value;
Bag.bearing = Bag.bearing - Cargo[num].weight;
Bag.goods[num] = Cargo[num].flag;
}
}
}
int main(void)
{
int Account,KG;
printf("请输入物品数量:");
scanf("%d",&Account);
printf("请输入背包承重:");
scanf("%d",&KG);
printf("*****************************************\n");
Bag.bearing = KG;
Bag.F = 0;
struct good tag;
for (int i = 0; i < Account; i++){
printf("\n");
Bag.goods[i]=0;
printf("输入物品%d的重量:",i + 1);
scanf("%f", &Cargo[i].weight);
printf("输入物品%d的价值:",i + 1);
scanf("%f", &Cargo[i].value);
Cargo[i].average = Cargo[i].value/Cargo[i].weight;
Cargo[i].flag = i + 1;
}
for (int i = 0; i < Account; i++){
for (int j = 0; j < Account-i-1; j++){
if (Cargo[j].average <= Cargo[j+1].average){
tag = Cargo[j];
Cargo[j] = Cargo[j+1];
Cargo[j+1] = tag;
}
}
}
input(Account);
printf("*****************************************\n");
printf("背包中的物品的重量:%.2f\n", KG - Bag.bearing);
printf("背包中的物品的价值:%.2f\n", Bag.F);
printf("背包中的物品的序号:");
for (int i = 0; i < Account; i++){
if (Bag.goods[i] != 0){
printf("%d ", Bag.goods[i]);
}
}
return 0;
}
运行结果:
请输入物品数量:4
请输入背包承重:10
*****************************************
输入物品1的重量:7
输入物品1的价值:42
输入物品2的重量:3
输入物品2的价值:12
输入物品3的重量:4
输入物品3的价值:40
输入物品4的重量:5
输入物品4的价值:25
*****************************************
背包中的物品的重量:9.00
背包中的物品的价值:65.00
背包中的物品的序号:3 4