To_Heart—题解——CSP-J2019 纪念品

题目:

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

每天,小伟可以进行以下两种交易无限次:

任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;

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

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

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

输入格式:

第一行包含三个正整数 T,N,M,相邻两数之间以一个空格分开,分别代表未来天数 T,纪念品数量 N,小伟现在拥有的金币数量 M。 接下来 T 行,每行包含 N 个正整数,相邻两数之间以一个空格分隔。第 𝑖 行的 N 个正整数分别为 P_{𝑖,1}, P_{𝑖,2},…… ,P_{𝑖,𝑁},其中 P_{𝑖,𝑗}表示第 𝑖 天第 𝑗 种纪念品的价格。

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

输入样例:

6 1 100 
50 
20 
25 
20 
25 
50
1
2
3
4
5
6
7

样例输出:

305
1
最佳策略是:
第二天花光所有 100 枚金币买入 5 个纪念品 1;
第三天卖出 5 个纪念品 1,获得金币 125 枚;
第四天买入 6 个纪念品 1,剩余 5 枚金币;
第六天必须卖出所有纪念品换回 300 枚金币,第四天剩余 5 枚金币,共 305 枚金币。
超能力消失后,小伟最多拥有 305 枚金币

题解

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

int a[10005][10005];
int dp[10005];

int main(){
	int t,n,m;
	cin>>t>>n>>m;
	for(int i=1;i<=t;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
		}
	} 
	for(int i=1;i<t;i++){
		memset(dp,0,sizeof dp);
		for(int j=1;j<=n;j++){
			if(a[i+1][j]>a[i][j]){
				for(int k=a[i][j];k<=m;k++){
					dp[k]=max(dp[k],dp[k-a[i][j]]+a[i+1][j]-a[i][j]);
				}
			}
		}
		m+=dp[m];
	}
	cout<<m;
	return 0;
}
posted @ 2020-09-23 14:08  To_Heart  阅读(32)  评论(0编辑  收藏  举报