题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4501
DP题。
dp[n][v1][v2][k]代表前n件商品,最多花了v1人民币,最多使用了v2的积分,最多使用了k次的免费券所获得的最大价值。
状态方程见代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
int a[105];
int b[105];
int val[105];
int dp[105][105][105][6];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n,v1,v2,k;
while(scanf(" %d %d %d %d",&n,&v1,&v2,&k)!=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf(" %d %d %d",&a[i],&b[i],&val[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=v1;j++)
{
for(int p=0;p<=v2;p++)
{
for(int w=0;w<=k;w++)
{
//不选择第i件商品
dp[i][j][p][w] = max(dp[i][j][p][w],dp[i-1][j][p][w]);
//第i件商品免费赠送
if(w>=1)
dp[i][j][p][w] = max(dp[i][j][p][w],dp[i-1][j][p][w-1] + val[i]);
//第i件商品花费积分
if(p>=b[i])
dp[i][j][p][w] = max(dp[i][j][p][w],dp[i-1][j][p-b[i]][w] + val[i]);
//第i件商品付费买
if(j>=a[i])
dp[i][j][p][w] = max(dp[i][j][p][w],dp[i-1][j-a[i]][p][w] + val[i]);
}
}
}
}
printf("%d\n",dp[n][v1][v2][k]);
}
return 0;
}