码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1114 Piggy-Bank

时间:2015-04-26 12:25:17      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:dp

刚开始想到的方法复杂度很大,抱着试一试的心态提交了,果然TLE了

然后搜了搜,是个完全背包,好多都不记得了,重新复习了一下。

第一个注释的解法是TLE的,第二个和第三个都是可行的,但思路不同。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf=0x7fffffff;
#define N 10005
int dp[N],p[505],w[505];
void init(){
	//memset(dp,-1,sizeof(dp));
	for(int i=0;i<N;i++) dp[i]=inf;
	dp[0]=0;
}
int main(){
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif
	int T,n,e,f;
	scanf("%d",&T);
	while(T--){
		init();
		scanf("%d%d%d",&e,&f,&n);
		for(int i=1;i<=n;i++) scanf("%d%d",&p[i],&w[i]);
		/*for(int i=1;i<=f-e;i++){//这个方法直接从n的规模开始考虑,明显没有用到dp的优点 
			for(int j=1;j<=n;j++){
				for(int k=0;k*w[j]<=i;k++){
					if(dp[i-k*w[j]]!=inf) dp[i]=min(dp[i],dp[i-k*w[j]]+p[j]*k);
				}
			}
		}*/
		/*for(int i=1;i<=n;i++){//从前i-1种推至前i种 
			for(int j=w[i];j<=f-e;j++){
				if(dp[j-w[i]]!=inf) dp[j]=min(dp[j],dp[j-w[i]]+p[i]);
			}
		}*/
		for(int i=1;i<=f-e;i++) {//重量为i时,n种物品能到达的最小值,在这里不用考虑第j种物品的数量,因为i是从小到大的,那么我们每次计算的时候都自动沿用数量为k-1个的值 
			for(int j=1;j<=n;j++){
				if(i-w[j]>=0&&dp[i-w[j]]!=inf) dp[i]=min(dp[i],dp[i-w[j]]+p[j]);
			}
		}
		if(dp[f-e]==inf) printf("This is impossible.\n");
		else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[f-e]);
	}
	return 0;
}


HDU 1114 Piggy-Bank

标签:dp

原文地址:http://blog.csdn.net/lj94093/article/details/45287313

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!