您的位置:首页 > 编程语言

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

2013-07-28 10:59 330 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐