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

Hdu2126

时间:2015-11-09 01:59:23      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:0/1背包

//Buy the souvenirs
//当发现由熟悉的动态规划题目变形得来的题目时,在原来的状态中加一维以满足新的限制是一种比较通用的方法。
//data:10 4
//1 2 3 4 5 6 7 8 9 0
#include<stdio.h>
#include<string.h>

int max(int a,int b);

int main(){
	int t,n,m,p[35];
	int i,j,dp[505][2];
	while(scanf("%d",&t)!=EOF){
		while(t--){
			
			scanf("%d%d",&n,&m);
			for(i=0;i<n;i++){
				scanf("%d",&p[i]);
			}
        	memset(dp,0,sizeof(dp));
			for(i=0;i<m;i++){
				dp[i][1]=1;
			}
			
			for(i=0;i<n;i++){
				for(j=m;j>=p[i];j--){
					
						if(dp[j][0]==dp[j-p[i]][0]+1) dp[j][1]=dp[j-p[i]][1]+dp[j][1];
				    	else if(dp[j][0]<dp[j-p[i]][0]+1) dp[j][1]=dp[j-p[i]][1];
						
						dp[j][0]=max(dp[j][0],dp[j-p[i]][0]+1);//状态转移方程
						
				/* if(dp[j][0]==dp[j-p[i]][0]+1){  
                    dp[j][1]=dp[j-p[i]][1]+dp[j][1];  
                }  
                else if(dp[j][0]<dp[j-p[i]][0]+1){  
                    dp[j][0]=dp[j-p[i]][0]+1;  
                    dp[j][1]=dp[j-p[i]][1];  
                } */
					     
				}
			}
		
			if(!dp[m][0]) printf("Sorry, you can‘t buy anything.\n");
			else printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",dp[m][1],dp[m][0]);
		}
	}
	return 0;
}
int max(int a,int b){
	return (a>b?a:b);
}


本文出自 “apple” 博客,请务必保留此出处http://22222222222.blog.51cto.com/9928498/1710731

Hdu2126

标签:0/1背包

原文地址:http://22222222222.blog.51cto.com/9928498/1710731

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