贪心算法-部分背包,C语言,C++编程

更多算法和资料,查看原文链接

有 n 件物品和一个容量为 C 的背包。第 i 件物品的重量是 w[i],对应的价值是 v[i]。物品可以分割,求解将哪些物品装入背包,可使物品总价值最大,但是不能超过总容量。

【贪心策略】

每次选取单位重量价值(因为物品可分隔)最大的物品装入。

【输出描述】

输出两行。第一行输出可以装入背包的物品重量;第二行输出装入背包物品的总重量。

【输出样例】

10 30 50 25 35
170

【参考程序】

// 爱码岛编程
#include <bits/stdc++.h>
using namespace std;

//为了方便理解,使用了struct
struct product {
    double w; //重量
    double v; //价格
    double u; //单位重量价值
};

product arr[10001]= {
    {35, 10, 10/35},
    {30, 40, 40/30},
    {60, 30, 30/60},
    {50, 50, 50/50},
    {40, 35, 35/40},
    {10, 40, 40/10},
    {25, 30, 30/25}
}; 

bool cmp(product p1, product p2) { 
    return p1.u > p2.u; 
}

int main() {
    int n = 7;
    double C = 150, wTotal = 0, vTotal = 0;

    //单位重量价值降序排列
    sort(arr, arr + n, cmp);

    int i = 0;
    while (i < n) {
        if (wTotal + arr[i].w <= C) {
            wTotal += arr[i].w;
            vTotal += arr[i].v;
            cout << arr[i].w << " ";
        }
        i++;
    }

    cout << endl << vTotal << endl;

    return 0;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值