HDOJ 2069 Coin Change 带限制条件的母函数

本文介绍了解决HDOJ2069问题的一种算法实现,该问题要求计算出使用五种不同面额硬币(50、25、10、5、1)兑换给定分数的所有可能方案数,且每种方案中硬币总数不超过100枚。

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

HDOJ 2069

题意

有5种分值的硬币无数,分别是50、25、10、5、1. 每给一个分值n(n<=250),输出用这5种硬币兑换的方案数,要求每个方案所用硬币数不超过100。规定分值n为0时方案数为1。


Sample Input
11
26


Sample Output
4
13


打表。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 251;
int c1[N][101],c2[N][101];          //c[j][t]表示用t个硬币凑出j分值的方案数
int c3[N];          //c3[i]表示分值i对应的方案数
const int cent[]={1,5,10,25,50};

int main(){
    memset(c1,0,sizeof(c1));
    memset(c2,0,sizeof(c2));
    memset(c3,0,sizeof(c3));
    c1[0][0]=1;

    for(int i=1; i<=5; i++){
        for(int j=0; j<N; j++){
            for(int k=0; k*cent[i-1]+j<N; k++)
                for(int t=0; t+k<=100; t++){         //t表示所用硬币数
                    c2[k*cent[i-1]+j][t+k]+=c1[j][t];
                }
        }
        for(int j=0; j<N; j++)
            for(int t=0; t<=100; t++){
                c1[j][t]=c2[j][t];
                c2[j][t]=0;
            }
    }

    for(int i=0;i<N;i++)
        for(int j=0;j<=100;j++)
            c3[i]+=c1[i][j];
    //pay attention:c3[0]=1
    //如果不计算i=0,则c3[0]=0
    //c3[0]的值视情况而定

    int n;
    while (~scanf("%d",&n)){
        printf("%d\n",c3[n]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值