HDU-2566,統計硬幣(暴力 or DP)

Problem Description:

假設一堆由1分、2分、5分組成的n個硬幣總面值爲m分,求一共有多少種可能的組合方式(某種面值的硬幣可以數量可以爲0)。  

Input: 

輸入數據第一行有一個正整數T,表示有T組測試數據;
接下來的T行,每行有兩個數n,m,n和m的含義同上。 

Output: 

對於每組測試數據,請輸出可能的組合方式數;
每組輸出佔一行。

Sample Input: 

2

3 5

4 8 

Sample Output:

1

AC Code(方法1:暴力):

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int t,ans,n,m;
	scanf("%d",&t);
	while(t--)
	{
		ans=0;
		scanf("%d %d",&n,&m);
		for(int i=0;i<=m/1;i++)
			for(int j=0;j<=m/2;j++)
				for(int k=0;k<=m/5;k++)
					if((i+j+k)==n&&(i*1+j*2+k*5)==m)
						ans++;
		printf("%d\n",ans);
	}
	return 0;
}

 AC Code(方法2:DP):

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1001;
int dp[N][N];
int num[4]={0,1,2,5};//分別代表幾種面值的硬幣 
int main()
{
	int t,n,m;
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		memset(dp,0,sizeof(dp));//清零 
		dp[0][0]=1;//第一個值爲1,表示用0個硬幣構成面值爲0的方案僅有一個 
		for(int i=1;i<=3;i++)//三種硬幣(1,2,5) 
		{
			for(int j=1;j<=n;j++)//n個硬幣 
			{
				for(int k=num[i];k<=m;k++)//每種硬幣的面值 
				{
					dp[j][k]+=dp[j-1][k-num[i]];//硬幣數量減1,同時減去對應硬幣的面值 
				}
			}
		}
		cout<<dp[n][m]<<endl;
	}
	return 0;
}

 

發佈了302 篇原創文章 · 獲贊 313 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章