XTU-OJ 1436-礼物

题目描述

马上要“六一”儿童节了,女儿吵着让爸爸买礼物。可女儿要买的东西实在太多了,爸爸手头上只有M元钱,觉得可能不能全部满足她,但是他又希望女儿尽量开开心心的。爸爸看了女儿的礼物单,上面有N件礼物,查到了所有礼物的价格,以及买给她会女儿开心度增加的值和不买给她开心度减少的值(每种礼物只能买1个)。他想知道开心度最大是多少,希望你能帮帮他。

输入

存在多组测试数据
每组数据的第一行是两个整数N(1 ≤ N ≤ 16),M(1 ≤ M ≤ 1,000)。如果N和M为0,表示输入结束。
以后的N行,每行为一个礼物的价格P(1 ≤ P ≤ 200),买增加的开心度I(1 ≤ I ≤ 50),不买减少的开心度D(1 ≤ D ≤ 50)。

输出

每个样例输出1行,为最大的开心度。

样例输入
3 100
30 10 5
80 20 16
60 15 7
3 100
30 10 5
70 20 16
60 15 6
0 0

样例输出
9
24

解题思路:这题每个物品有 价格,又有相应的价值,又让我们求利益最大化。 像这类的题就是很明显的 背包问题 , 而这个题是较为简单的  0/1背包 。具体怎么写大家在CSDN上搜一下。

AC代码: 

#include <stdio.h>
#include <stdlib.h>

struct GIFT{                // 结构体
    int price,happy,sad;
}gift[20];

int Max(int x,int y){
    if (x <= y) return y;
    return x;
}

int main()
{
    int N,M,unhappy;
    while (scanf("%d %d",&N,&M) != EOF && !(N==0 && M==0))
    {
        unhappy = 0;
        int value[18][1012] = {0};
        for (int i = 1; i <= N; i ++)           // 输入
        {
            scanf("%d %d %d",&gift[i].price,&gift[i].happy,&gift[i].sad);
            unhappy += gift[i].sad;
        }
        // 初始化,我这里是从最大不开心度往下减的,可以算是倒着来,不习惯的可以从0开心度往上加。
        for (int i = 0; i <= N; i ++)   value[i][0] = -unhappy;
        for (int j = 0; j <= M; j ++)   value[0][j] = -unhappy;

        for (int i = 1; i <= N; i ++)           // 0/1背包 核心代码
        {
            for (int j = 0; j <= M; j ++)
            {
                if (j < gift[i].price)
                    value[i][j] = value[i-1][j];
                else
                    value[i][j] = Max(value[i-1][j],value[i-1][j-gift[i].price]+gift[i].happy+gift[i].sad);
            }
        }
        printf("%d\n",value[N][M]);
    }
    return 0;
}   

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值