SDUT OJ[3109] 买买买 背包 dp

好久没做题了,今天来一发。


根据题意,可以推出状态转移方程:

dp[cost][weight] = max(dp[cost][weight], dp[cost-s[i].cost][weight-s[i].weight] + s[i].profit)

cost与weight可以互换


毕竟基础差,看了许久,又在舍友的讲解下才明白思路(o´・ェ・`o)


后来还因为个人细节没注意到,WA了一次......


加注释后的代码如下(尝试着优化,结果效果相差不大  (。・・)ノ  书看得少),题目在文章后面给出


#include<iostream>   // Required for max
#include<cstring>    // Required for memset
#include<cstdio>     // Required fro scanf,printf
#define MAX 101      // 题目中最大数为100,所以数组下界为101

// 存储货物的重量、进价、盈利
struct {
 int weight, cost, profit;
}s[MAX];

// dp数组
int dp[MAX][MAX];

int main()
{
    int n, m, k;
    while(scanf("%d%d%d",&n,&m,&k) != EOF)
    {
        // 对输入的数据处理后存在结构体中
        for(int z=0; z<k; z++)
        {
            int w, u, v;
            scanf("%d%d%d",&w,&u,&v);
            s[z].weight = w;
            s[z].cost = u;
            s[z].profit = v-u;
        }
        // 初始化dp数组
        memset(dp, 0, sizeof(dp));
        // 状态转移方程 dp[cost][weight] = max(dp[cost][weight], dp[cost-s[i].cost][weight-s[i].weight] + s[i].profit)
        for(int cost=0; cost<=m; cost++)
            for(int weight=0; weight<=n; weight++)
            {
                for(int i=0; i<k; i++)
                {
                    if(cost-s[i].cost>=0 && weight-s[i].weight>=0)
                        dp[cost][weight] = std::max(dp[cost][weight], dp[cost-s[i].cost][weight-s[i].weight] + s[i].profit);
                }
            }
        printf("%d\n", dp[m][n]);
    }
    return 0;
}


买买买

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

我飞最近开始跑商了,比如从淄博往黄岛贩烧饼,从黄岛往淄博贩鱿鱼干。
当然我飞壕还会贩别的。
现在已知黄岛有K种商品,每种商品重量为W,在黄岛买价为U,在淄博卖价为V。
由于我飞经常锻炼身体强壮,每次都能扛总重量不超过N的货物,现在我飞身上有钱M,请你帮我飞计算一下他这一次从黄岛到淄博最多能赚多少钱,假设每种商品都有无穷多。所有的商品不可被分割,即若购买必须购买整件商品。

输入

多组数据。
对于每组数据的第一行有三个整数N,M,K(1 <= N,M,K <= 100)。
接下来的K行,每行三个整数W,U,V(1 <= W,U,V <= 100)。

输出

对于每组数据输出一个整数代表我飞的最大收益。

示例输入

1 1 1
1 1 1

示例输出

0

提示

 

来源

 zmx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Uri · Boyka

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值