P5662 [CSP-J2019] 纪念品

题目

题目传送门(●'◡'●)

点击查看题目
题目描述

小伟突然获得一种超能力,他知道未来 T 天 N 种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。

每天,小伟可以进行以下两种交易无限次:
1. 任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;
2. 卖出持有的任意一个纪念品,以当日价格换回金币。

每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。

T 天之后,小伟的超能力消失。因此他一定会在第 T 天卖出所有纪念品换回金币。

小伟现在有 M 枚金币,他想要在超能力消失后拥有尽可能多的金币。

输入格式

第一行包含三个正整数 T, N, M,相邻两数之间以一个空格分开,分别代表未来天数 T,纪念品数量 N,小伟现在拥有的金币数量 M。

接下来 T 行,每行包含 N 个正整数,相邻两数之间以一个空格分隔。第 i 行的 N 个正整数分别为 P_{i,1},P_{i,2},……,P_{i,N},其中 P_{i,j} 表示第 i 天第 j 种纪念品的价格。

输出格式

输出仅一行,包含一个正整数,表示小伟在超能力消失后最多能拥有的金币数量。

分析

题目中说了,求在最后将所有纪念品卖掉后能拥有的最多金币数量。

那么我们就可以设 \(dp_{i}\) 表示在第 \(i\) 天把所有纪念品都卖掉后能拥有的最多金币的数量。

由于对于第 \(i-1\) 天,卖出纪念品和买入纪念品的价格相同,因此,我们可以在第 \(i-1\) 天先将手上所有的纪念品都卖掉。然后利用与次日相同纪念品的价格差挑选最佳纪念品从中赚取利润(是的,这就叫中间商赚差价)。即可求出第 \(i\) 天初始得到的最大金币(这里指的也是在第 \(i\) 天将所有纪念品卖掉后的,即\(dp_i\) )。

那么他的状态转移方程就是:

\(dp_{i}=\max\){\(dp_{i-1}-在 i-1 天买纪念品的总花费+在第 i 天卖纪念品所得到的总收益\)}

还有变量无法表示出来,我们就将他加入状态转移方程中。(相信有聪明的小朋友已经看出来接下来就是标准的完全背包了)

\(dp_{i,j}\) 表示用第 \(i\) 天把所有纪念品都卖掉后能拥有的最多金币花费\(j\)元购买纪念品所能得到的最大价值。

花费的是第 \(i\) 天购买纪念品的价格,得到的价值为第 \(i+1\) 天卖出后得到的收益。

对于一个纪念品 \(k\)

\(dp[i][j]=\max(dp[i][j],dp[i][j-val[i][k]]+val[i+1][k])\)

\(i+1\) 天能得到的最多金币数为:

\(ans=max(ans,num-j+dp[i][j])\)

\(num\) 是第 \(i\) 天获得的最大金币数, \(ans\) 是第 \(i+1\) 天能得到的最多金币数。

写代码的过程中可以发现我们己经枚举了天数\(t\),且在状态转移方程中 \(i\) 丝毫不动,因此可以将其省略。

code

点击查看代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int T,n,m;
int dp[10005],val[105][1005];
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",&val[i][j]);
	
	int ans=m;
	for(int t=1;t<T;t++){
		memset(dp,0xcf,sizeof(dp));
		dp[0]=0;
		for(int i=1;i<=n;i++){
			for(int j=val[t][i];j<=ans;j++){
				dp[j]=max(dp[j],dp[j-val[t][i]]+val[t+1][i]);
			}
		}
		int num=ans;
		for(int i=1;i<=num;i++) ans=max(ans,num-i+dp[i]);
	}
	cout<<ans<<endl;
	return 0;
}

summary

通过这题,我们可以总结出,一题DP可以先将状态设为题目要求的东西,再列出状态转移方程。如果状态转移方程有些部分无法表示出来,就将他加入状态之中。

\(-End-\)

\(2022.8.18\)

\(\color{red}{DP百道第2题,冲冲冲!}\)

posted @ 2022-08-18 16:37  k_stefani  阅读(118)  评论(0编辑  收藏  举报