hdu 2126 Buy the souvenirs

来源:互联网 发布:广数928tc端面切削编程 编辑:程序博客网 时间:2024/04/30 01:35

链接:点击打开链接

题意:n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数。加一维表示已经买几件物品。


#include<iostream>#include<string.h>#include<algorithm>using namespace std;int main(){int i,j,t,n,m,sum,ans;int dp[510][2],a[40];scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);memset(dp,0,sizeof(dp));for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<=m;i++)//每种物品都有一种选择 dp[i][1]=1;for(i=0;i<n;i++){ for(j=m;j>=a[i];j--){if(dp[j][0]<dp[j-a[i]][0]+1){dp[j][0]=dp[j-a[i]][0]+1;dp[j][1]=dp[j-a[i]][1];}else if(dp[j-a[i]][0]+1==dp[j][0])dp[j][1]=dp[j-a[i]][1]+dp[j][1];}}if(dp[m][0]) printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",dp[m][1],dp[m][0]);else printf("Sorry, you can't buy anything.\n"); }return 0;} 
第二种:dp[i][j][k]表示前i种,买了j个,花了k元的方案数有几种。动态规划方程if(k>=a[i]) dp[i][j][k]+=dp[i-1][j-1][k-a[i]];dp[i][j][k]+=dp[i-1][j][k];
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;int dp[35][35][550];int main(){int i,j,k,t,n,m,a[35],x,y;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);for(i=1;i<=n;i++)scanf("%d",&a[i]);memset(dp,0,sizeof(dp));for(i=0;i<=n;i++)//初始化 for(j=0;j<=m;j++)dp[i][0][j]=1;for(i=1;i<=n;i++){for(j=1;j<=i;j++){for(k=m;k>=0;k--){if(k>=a[i])  dp[i][j][k]+=dp[i-1][j-1][k-a[i]];  dp[i][j][k]+=dp[i-1][j][k];}}} x=-1;y=-1;for(i=1;i<=n;i++){for(j=1;j<=n;j++){for(k=m;k>=0;k--){if(dp[i][j][k]){x=j;y=dp[i][j][k];break;}}}}if(x!=-1) printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",y,x);  else printf("Sorry, you can't buy anything.\n");}return 0;} 


	
				
		
原创粉丝点击