参考文章链接:
题目描述:
牛牛开的银行里一共有n种硬币,第i种硬币价值为vi。
妞妞来到牛牛的银行准备把k元钱兑换为零钱,牛牛想知道一共有多少种零钱兑换方案。例如,牛牛银行有1,2,5三种硬币,k=5,有以下兑换方案:
11111,1112,122,5
所以有4种兑换方案。
输入描述:
输入的第一行为询问数t(1<= t <= 100)。接下来每两行一个测试用例。第一行包含两个整数n和k(1<= n <=100,1<=k <=10000),表示硬币的种类数和妞妞需要兑换的钱数。第二行n个正整数vi(1<= vi <=200),表示每种硬币的面值
输出描述:
输出一个整数,表示兑换k元钱的方案数。因为答案方案数可能很大,输出对100000007取模的结果。
示例1
输入:
1
3 5
1 2 5
输出:
4
通过测试代码:
#include <iostream>
#include <string>
#include <vector>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <queue>
#include<list>
#include<vector>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
long long chargeTypes(vector<long long> coinsValues, long long n){
long long m = coinsValues.size();
vector<vector<long long>>c;
for(long long i=0;i<m+1;i++)
{
vector<long long>tmp(n+1,0);
c.push_back(tmp);
}
for(long long i = 0; i <=m; i++)
c[i][0] = 1;
for(long long i = 1; i <=n; i++)
c[0][i] = 0;
for(long longi = 1; i <=m; i++)
{
for(long long j = 1; j <=n; j++)
{
if(j < coinsValues[i-1])
{
c[i][j] = c[i-1][j];
continue;
}
c[i][j] = c[i-1][j] + c[i][j - coinsValues[i-1]];//coinsValues下标从0开始
}
}
return c[m][n];
}
long long recursiveChargeTypes(vector<long long> coinsValues, long long m, long long n)
{
if(n == 0)
return 1;
if(n < 0)
return 0;
if(m <= 0)
return 0;
else
return recursiveChargeTypes(coinsValues, m-1, n) + recursiveChargeTypes(coinsValues, m, n-coinsValues[m]);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int nn,k;
cin>>nn>>k;
vector<long long>coinsValues;
long long res=0;
vector<long long>quchong(201,0);
for(long long i=0;i<nn;i++)
{
long long tmp=0;
cin>>tmp;
if(quchong[tmp])
{
}
else
{
coinsValues.push_back(tmp);
quchong[tmp]=1;
}
}
sort(coinsValues.begin(),coinsValues.end());
res=chargeTypes(coinsValues, k);
cout<<res<<endl;
}
return 0;
}