`
java-mans
  • 浏览: 11467846 次
文章分类
社区版块
存档分类
最新评论

hdu3496-Watch The Movie二维费用DP

 
阅读更多

原来的原来这是个二维费用的DP、、、、、好吧 又一次显现了我的无知

题意很明显,必须买m张时间在L之内看完的电影票,使其价值最大。

好吧,就解释下二维DP的思想吧

所谓的二维费用,就是对于同个物品有两个不同的费用,需要进行约束,一种约束可以用一维数组来实现,显然,二维可以解决二维费用((*^__^*) 嘻嘻……好像是废话呢)。

知道这个 代码就很好写了

然而的然而 ,这里有个需要注意的,题目要求必须买m张电影票,也就是说,第一维数组必须是满的,即初始化的时候必须是负无穷大(若找最小值,则是正无穷大)。

唉,第一次这样初始化二维数组,有点木讷,这里特意标明下。

OK,附上代码:

//long long 最大表示10^19
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define Max 2147483648
struct info
{
	int T;
	int V;
}N[101];
int dp[105][1005];//记录i张票时间j可以买到的最大的价值
int main()
{
	int t;
	int i,j,k;
	cin>>t;
	while(t--)
	{
		int n,m,l;
		cin>>n>>m>>l;//n场电影,必须买m场,最长花费l时间
		for(i=0;i<n;i++)
		{
			cin>>N[i].T>>N[i].V;
		}
	//	sort(N,N+n,cmp);
	//初始化
		memset(dp,0,sizeof(dp));
		for(i=1;i<=m;i++)
			for(j=0;j<=l;j++)
				dp[i][j]=-Max;
		for(i=0;i<n;i++)
		{
			for(j=m;j>0;j--)
			{
				for(k=l;k>=N[i].T;k--)
					dp[j][k]=max(dp[j][k],dp[j-1][k-N[i].T]+N[i].V);
			}
		}
		if(dp[m][l]<0) cout<<"0"<<endl;
		else cout<<dp[m][l]<<endl;
	}
	return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics