背包问题(附源码)

背包问题描述:
给定n个重量为w1,…wn,价值为v1,…vn 的物品和一个承重为W的背包,求这些物品中最有价值的一个子集,并且要能够装到背包中。

背包的承重为10,求能装到背包中的最有价值的子集。假设有物品如下表:

物品序号1234
物品重量7345
物品价值42124025

物品的数据结构如下:

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值