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
2
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;
}