HDU ACM 4501 小明系列故事——买年货->多维背包(多为01背包)

分析:dp[l][i][j][k]表示选前l件时花费i元,积分j,免费p时能获得的最大价值。k值也作为一种背包算。

状态转移方程:

dp[l][i][j][k] = max(dp[l][i][j][k], dp[l-1][i-a[l]][j][k]+c[i], dp[l-1][i][j-b[l]][k]+c[i], dp[l-1][i][i][k-1]+c[i])  (k > 0, i >= a[l] , j >= b[l], k= 1,2,3,4....n)

a[l]表示第l种用现金要的的钱数,b[l]表示第l种用积分兑换需要花的积分数。

#include<iostream>
using namespace std;

int dp[101][101][6];  //dp[l][i][j][k],表示选l件商品花费i元,j积分,p免费是获得的最大价值,滚动数组减一维
int a[101],b[101],c[101];
int n,v1,v2,k;
#define max(a,b) ((a)>(b)?(a):(b))

int sovle()
{
	int i,j,kk,l,ans;

	memset(dp,0,sizeof(dp));
	for(i=0;i<n;i++)
		for(j=v1;j>=0;j--)
			for(kk=v2;kk>=0;kk--)
				for(l=k;l>=0;l--)
				{
					ans=0;
					if(j>=a[i])
						ans=max(ans,dp[j-a[i]][kk][l]+c[i]);
					if(kk>=b[i])
						ans=max(ans,dp[j][kk-b[i]][l]+c[i]);
					if(l>=1)
						ans=max(ans,dp[j][kk][l-1]+c[i]);
					dp[j][kk][l]=max(ans,dp[j][kk][l]);
				}
	return dp[v1][v2][k];
}

int main()
{
	int i;

	while(cin>>n>>v1>>v2>>k)
	{
		for(i=0;i<n;i++)
			cin>>a[i]>>b[i]>>c[i];
		cout<<sovle()<<endl;
	}
    return 0;
}
时间: 2024-09-30 09:50:13

HDU ACM 4501 小明系列故事——买年货->多维背包(多为01背包)的相关文章

HDU ACM 4506 小明系列故事——师兄帮帮忙 -&gt;简单快速幂

分析:t单位时间后i的位置将变化到(i+t)%n位置上,下标i从0开始,之后快速幂完成. #include<iostream> using namespace std; __int64 f_pow(__int64 a,__int64 b,__int64 mod) { __int64 s=1; while(b>0) { if(b&1) s=s*a%mod; a=a*a%mod; b>>=1; } return s; } int main() { int T; __int

HDU ACM 4511 小明系列故事——女友的考验-&gt;AC自动机+DP

分析:参考别人的搞. 1.AC自动机: 使用AC自动机来压缩路段,如禁掉的路段是1->2->3,那么插入字符串(123) ,注意点只有1~50,所以0~50用ASCII 压缩成字符串即可. 这样就能够完成禁止路段的在线状态转移. 2.DP部分: 两点之间的最短路.dp[i][j]表示在地点i,当前字符是j的状态. 初始化:fill(&dp0][0],&dp[maxn-1][maxp-1],inf),inf=1e12,memset不能用. 边界:首先找出出发点在Pool中的位置,

【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)

Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: 1.假设小明在的位置是1号点,女朋友在的位置是n号点,则他们之间有n-2个点可以走,小明每次走的时候只能走到比当前所在点编号大的位置: 2.小明来的时候不能按一定的顺序经过某些地方.比如,如果女朋友告诉小明不能经过1 -> 2 -> 3,那么就要求小明来的时候走过的路径不能包含有1 ->

HDU ACM 4515 小Q系列故事——世界上最遥远的距离

分析:最容易的方法就是一天一天的模拟了. #include<iostream> using namespace std; int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; #define Y 2013 #define M 3 #define D 24 bool leap(int y) { return y%400==0 || y%4==0&&y%100!=0; } void change(int k,int fg) //-1回到过

HDU ACM 4510 小Q系列故事——为什么时光不能倒流

分析:水题. #include<iostream> using namespace std; int main() { int x1,y1,z1,x2,y2,z2; int n,x3,y3,z3; cin>>n; while(n--) { scanf("%d:%d:%d",&x1,&y1,&z1); scanf("%d:%d:%d",&x2,&y2,&z2); x3=y3=z3=0; z3=z1

HDU ACM 4505 小Q系列故事——电梯里的爱情

分析:水题,电梯要上到最高层还要回到最底层,所以电梯上下的时间等于最高层乘以10,电梯开门完的时间为5加上人数,因为下一个人只需1秒. #include<iostream> using namespace std; int main() { int f[105]; int i,sum; int C,n,a,max; cin>>C; while(C--) { cin>>n; memset(f,0,sizeof(f)); sum=0; max=-1; for(i=0;i&l

HDU ACM 4500 小Q系列故事——屌丝的逆袭

分析:水题,注意计算某个位置的分数时他自己的不算,加减都是绝对值(一开始这里还理解错了). #include<iostream> #include<cmath> using namespace std; int a[25][25]; int main() { int i,j,n,m; int maxv,maxi,maxj,tmp; while(cin>>n>>m && n+m) { for(i=0;i<n;i++) for(j=0;j&

hdu 4506 小明系列故事——师兄帮帮忙

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4506 题目大意:找规律,判断k的t次幂前面的系数. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 __int64 fun(__int64 a,__int64 b) 6 { 7 __int64 s=1; 8 while (b) 9 { 10 if (b%2==1) 11 s=s*a%1000000

HDU 小明系列故事——师兄帮帮忙 快速幂

小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 4850    Accepted Submission(s): 1275 Problem Description 小明自从告别了ACM/ICPC之后,就开始潜心研究数学问题了,一则可以为接下来的考研做准备,再者可以借此机会帮助一些同学,尤其是漂亮的师妹.这不,班