P5662 [CSP-J2019] 纪念品
tags
贪心,dp,完全背包
思路
- “当日购买的纪念品也可以当日卖出换回金币”,所以我们可以当天买,当天卖,但是是以后一天的价格取卖,这样的话就不必取考虑跨天买卖,只需考虑当天即可
- 状态表示
- 当天手里的钱为背包容量
- 当天物品的价格为消耗
- 明天物品价格为收益
- 对于每一天,去进行一次完全背包:前i天买进卖出前j个物品的最大收益,注意i到t-1循环结束,只循环t-1轮背包
- 每天都得去更新背包容量
- 每天一次完全背包,dp每天都得更新为0
AC代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxt=105,maxn=105,maxm=1e4+10;
int t,n;
ll m;
int qian[maxt][maxn];
ll dp[maxm];
int main(){
cin>>t>>n>>m;
for(int i=1;i<=t;i++){
for(int j=1;j<=n;j++){
cin>>qian[i][j];
}
}
for(int i=1;i<t;i++){
memset(dp,0,sizeof(dp));
for(int j=1;j<=n;j++){
for(int k=qian[i][j];k<=m;k++){
dp[k]=max(dp[k],dp[k-qian[i][j]]+qian[i+1][j]-qian[i][j]);
}
}
m+=dp[m];
}
cout<<m<<endl;
}