题目描述
给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。
输入描述:
输入为一个数字N,即需要拼凑的面额
输出描述:
输出也是一个数字,为组成N的组合个数。
示例1
输入
复制
5
输出
复制
2
解法上类比于“0/1背包”问题:
table[i,j]表示使用序号为0到i的钱币拼凑成面额j所需要的数目
#include "stdio.h"
#include <vector>
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
vector<vector<long long >> table(6, vector<long long >(n+1 ,0));
vector<int> money{1,5,10,20,50,100};
for(int i = 1;i<n+1;i++)
{
if(i%money[0]==0)
table[0][i] = 1;
}
for(int i = 0;i<money.size();i++)
{
table[i][0] = 1;
}
for(int i = 1;i<money.size();i++)
{
for(int j = 1;j<n+1;j++)
{
table[i][j]=table[i-1][j]; // 不使用序号为i的钱币,拼凑成面额j所需要的数目
if(j>=money[i])
table[i][j] += table[i][j-money[i]]; //使用序号为i的钱币,拼凑成面额j所需要的数目
}
}
cout<<table[money.size()-1][n]<<endl;
}
return 0;
}