题意
有五种硬币不限数量,面值分别是1,5,10,25,50。问你用这些硬币组成n元有多少种方式,硬币的总数要不超过100个。
思路
dp,背包,设dp[i][j]表示用j个硬币组成i元的方法数,则
dp[i][j]=dp[i][j]+dp[i-v][j-1],v表示当前的硬币面值。
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll dp[300][110];//dp[i][j]表示用j个硬币拼出i元的方法数
int a[5]={1,5,10,25,50};//五种硬币的面值
int main()
{
int n,i,j,k;
while(cin>>n)
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=0;i<5;i++)
{
for(j=1;j<=100;j++)//硬币总数小于100
{
for(k=a[i];k<=n;k++)
dp[k][j]+=dp[k-a[i]][j-1];
}
}
int res=0;
for(i=0;i<=100;i++)
res+=dp[n][i];
cout<<res<<endl;
}
return 0;
}