HDOJ-2069 Coin Change(母函数)

本文探讨了一道增加硬币组合限制的数学问题,即总硬币数量不能超过100。通过使用动态规划的方法,作者详细解释了如何在满足条件的同时,记录每种可能的硬币组合方案。代码示例展示了实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题比比普通母函数题多了个限制就是总硬币数不能超过100,那么在记录每种方案时,同时要记录构成该种方案的硬币数.

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <climits>
#include <vector>

using namespace std;

#define maxn 255 
int num[5] = {1, 5, 10, 25, 50};
vector<int> v1[maxn], v2[maxn]; 
int main(){

    //freopen("in.txt", "r", stdin); 
    int n;

    while(cin >> n){

        for(int i = 0; i <= n; i++){
           v1[i].clear();
           v2[i].clear();
        }
        v1[0].push_back(0);
        v2[0].push_back(0);

        for(int i = 0; i < 5; i++){
            for(int j = 0; j < n; j++){
                for(int h = 1; h <= 100 && h*num[i] + j <= n; h++){
                      for(int p = 0; p < v1[j].size(); p++){
                        if(v1[j][p] + h <= 100){
                          int m = h * num[i] + j;
                          v2[m].push_back(v1[j][p]+h);
                        }
                      } 
                }
            }
        for(int h = 0; h <= n; h++)
               v1[h] = v2[h];
        }
        cout << v1[n].size() << endl;
    }

    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值