招商银行(零钱兑换,动态规划解法)

参考文章链接:
题目描述:
牛牛开的银行里一共有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;
}

猜你喜欢

转载自blog.csdn.net/weixin_38317875/article/details/80919088