完全背包(类买卖股票问题)

时间:2024-06-03 06:56:15

题目传送门——纪念品

题解:这题我一开始以为是简答的那个买卖股票问题,但是做了之后发现并没有那么简单,但是经过思考时候,我发现其和完全背包类问题差不多,怎么说呢,我们首先用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;
}