硬币组合

这是Project Euler的第31题,要求找出200 pens的所有组合数,硬币包括1,2,5,10,20,50,100,200。

#include
#include
using namespace std;

long long dfs(int rest, int k, vector<int>& coins,vector<vector<int>>& memo){
     
    if(rest==0){
     
        memo[rest][k] = 1;
        return 1;
    }
    if(memo[rest][k]!=-1) return memo[rest][k];
    long long res = 0;
    for(int i=k;i<coins.size();i++){
     
        if(rest-coins[i]>=0) res += dfs(rest-coins[i],i,coins,memo);
    }
    memo[rest][k]= res;
    return res;
}

int main(){
     
    vector<vector<int>> memo(201,vector<int>(8,-1));
    memo[0][0] =1;
    vector<int> coins = {
     1,2,5,10,20,50,100,200};
    long long res = dfs(200,0,coins,memo);
    cout<<res<<endl;
}

你可能感兴趣的:(编程基础)