/*
8. 给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,
编写程序求组成N员(N为0-10000的非负整数)的不同组合的个数。输入为一个数字N,
即需要拼凑的面额。输出也是一个数字,为组成N的组合个数。
eg:输入5,输出2。
*/
#include<iostream>
using namespace std;
int main()
{
int n; //输入的面额
cout<< "请输入面额大小(0-10000):"<<endl;
cin>>n;
int arr[]={1,5,10,20,50,100}; //六种面额的数组
for(int i1=0;i1<6;i1++)
{
cout<<arr[i1]<<" ";
}
cout<<endl;
int dp[6][10001]; //表示面额为n时候的组合数目,并且将数组初始化为0
for(int k=0;k<6;k++) //当给出的金钱为0时,只有一种组合
{
dp[k][0]=1;
}
for(int a0=1;a0<=n;a0++) //面额为1元的数额只有一种组合方法
{
dp[0][a0]=1;
}
for(int i=1; i<6;i++) //面额为arr[0]-a[5]时的组合
{
for(int j=1; j<=n; j++) //利用动态规划法,从小到大填表 dp[n]
{
if(j>=arr[i])
{
dp[i][j]=dp[i-1][j]+dp[i][j-arr[i]];
}
else{
dp[i][j]=dp[i-1][j];
}
}
}
for(int m=0;m<=5;m++) //打印表
{
for(int n1=0;n1<n;n1++)
{
cout<<dp[m][n1]<<" ";
}
cout<<endl;
}
cout<<dp[5][n]<<endl;
return 0;
}