洛谷P5662 [CSP-J2019] 纪念品 题解

题目链接

P5662 [CSP-J2019] 纪念品

题目大意

已知 N N N 个商品未来 T T T 天的价格,现在手上有 M M M 元钱,求 T T T 天后最多能获得多少钱。

思路分析

首先,持有一个物品等同于每天买下这个物品,第二天卖出后再迅速买入,第三天卖出后再迅速买入……

所以我们可以从第 1 1 1 天遍历至第 T − 1 T-1 T1 天,每天对 N N N 个商品进行一次完全背包,对钱数 M M M 进行更新。

我们以物品当日的价格 p i , j p_{i,j} pi,j 作为重量,赚到的钱 p i + 1 , j − p i , j p_{i+1,j}-p_{i,j} pi+1,jpi,j 为价值,所以状态转移方程为
d p ( k ) = max ⁡ ( d p ( k ) , d p ( k − p i , j ) + p i + 1 , j − p i , j ) dp(k)=\max(dp(k),dp(k-p_{i,j})+p_{i+1,j}-p_{i,j}) dp(k)=max(dp(k),dp(kpi,j)+pi+1,jpi,j)

代码

#include<bits/stdc++.h>
using namespace std;

const int N=105,M=1e4+10;
int t,n,m;
int p[N][N],dp[M];

int main(){
    scanf("%d%d%d",&t,&n,&m);
    for (int i=1;i<=t;++i){
        for (int j=1;j<=n;++j) scanf("%d",&p[i][j]);
    }
    for (int i=1;i<t;++i){
        memset(dp,0,sizeof dp);
        for (int j=1;j<=n;++j){
            for (int k=p[i][j];k<=m;++k) dp[k]=max(dp[k],dp[k-p[i][j]]+p[i+1][j]-p[i][j]);
            //完全背包模板,买入一个商品此日能赚到 p[i+1][j]-p[i][j]
        }
        m+=dp[m];//因为获得的钱可以再用于交易,所以每天要更新 m
    }
    printf("%d",m);
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值