Hdu-2069_Coin Change
题意:有若干5种面值的硬币,分别是1分,5分,10分,20分,50分。求现在表示钱数n(n<250),有多少种方案?
乍一看是母函数的题,但是后面说,每一种方案 硬币数目不超过100;
我们可以看出,该题就是指定因子的整数划分。
用动态规划,dp[j][k]=dp[j][k] + dp[j-1][k-b[i]];
注意:测试用例有n=0的情况,正确的结果应该输出1。这里wa了!汗。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define M 252
int money[5]={1,5,10,25,50};
int dp[102][M];
void solve()
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;//注意初始化
int i,j,k;
for(i=0;i<5;i++)
for(j=1;j<=100;j++)//硬币个数
{
for(k=money[i];k<M;k++)//k是组合得到的money 数
dp[j][k]=dp[j][k] + dp[j-1][k-money[i]];
}
}
int main()
{
solve();
int n,j,ans;
while(cin>>n)
{
if(n==0){printf("1\n");continue;}
ans=0;
for(j=1;j<=n&&j<=100;j++)
ans+=dp[j][n];
cout<<ans<<endl;
}
return 0;
}