贪心算法求解背包问题

贪心算法求解背包问题


本题可以用结构体构造一个宝物的类型,包括宝物的重量,价值和性价比。

既然是贪心算法,就是要单位重量内拿的宝物价值最高
所以通过性价比对宝物进行从大到小排序,然后依次拿取就好了


代码

#include <iostream>
#include <algorithm>
#include <cstdio>
const int M = 101;
using namespace std;
struct Treasure
{
    double w; //每个宝物的重量
    double v; //每个宝物的价值
    double p; //性价比
} s[M];
bool cmp(Treasure a, Treasure b)
{
    return a.p > b.p; //根据宝物的单位价值从大到小排序
}
int main()
{
    int N, T; //N堆金币,T为背包最大载重量
    cin >> N >> T;
    for (int i = 0; i < N; i++) //输入宝物重量和价值
    {
        cin >> s[i].w >> s[i].v;
        s[i].p = s[i].v / s[i].w;
    }
    sort(s, s + N, cmp); //按宝物单位价值从大到小排序
    double sum = 0.0;    //表示拿走宝物价值总和
    for (int i = 0; i < N; i++)
    {
        if (T > s[i].w)
        {
            T -= s[i].w;
            sum += s[i].v;
        }
        else
        {
            sum += T * s[i].p;
            break; //背包装满,停止循环
        }
    }
    printf("%.2f", sum);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值