题目传送门——纪念品
题解:这题我一开始以为是简答的那个买卖股票问题,但是做了之后发现并没有那么简单,但是经过思考时候,我发现其和完全背包类问题差不多,怎么说呢,我们首先用p[i][j]去统计每天每种物品的价格,然后以每天的价格作为重量,总金额作为背包容量,两天的差值作为物品价值(因为哪怕你是第1天买,第三天买,也可以理解为,1买,2卖,2买,3卖,这样就可以将差值看成物品价值)
还有一个细节,就是在每天要初始化一下dp数组
#include<bits/stdc++.h>
using namespace std;
int t,n,m;
int p[105][105];//表示的是第i天,物品j的价格
int dp[10005];//手上金币为k的时候,所获得的最大金币为dp[k]
int main()
{
cin>>t>>n>>m;
for(int i=1;i<=t;i++)
{
for(int j=1;j<=n;j++)
{
cin>>p[i][j];
}
}
for(int i=1;i<t;i++)//遍历天数
{
memset(dp,0,sizeof(dp));//将dp数组初始化为0
for(int j=1;j<=n;j++)//遍历物品
{
for(int k=p[i][j];k<=m;k++)//完全背包思路,k用金钱表示背包容量
{
dp[k]=max(dp[k],dp[k-p[i][j]]+p[i+1][j]-p[i][j]);
}
}
m+=dp[m];//每次都加上当天能获得的最大价值
}
cout<<m;
return 0;
}