2013腾讯编程马拉松初赛第〇场(3月20日)小明系列故事——买年货

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4501

思路:三维01背包~dp[i][j][k]表示用i的现金,j的积分,k次免费能买到的最大价值,逆序遍历优化空间复杂度。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=105;
int a[maxn],b[maxn],w[maxn];
int dp[maxn][maxn][6];
int main()
{
	int n,v1,v2,k;
	while(cin>>n>>v1>>v2>>k)
	{
		for(int i=0;i<n;i++)
			cin>>a[i]>>b[i]>>w[i];
		memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++)
		{
			for(int p=v1;p>=0;p--)
			{
				for(int q=v2;q>=0;q--)
				{
					for(int j=k;j>=0;j--)
					{
						int tmp=dp[p][q][j];
						if(p>=a[i]){
							tmp=max(tmp,dp[p-a[i]][q][j]+w[i]);
						}
						if(q>=b[i]){
						    tmp=max(tmp,dp[p][q-b[i]][j]+w[i]);
						}
						if(j>=1){
							tmp=max(tmp,dp[p][q][j-1]+w[i]);
						}
						dp[p][q][j]=max(tmp,dp[p][q][j]);
					}
				}
			}
		}
		cout<<dp[v1][v2][k]<<endl;	
	}
	return 0;
} 


你可能感兴趣的:(动态规划,编程马拉松)