HDU-2016 Coin Change (母函数 | 多重背包)

题意:给你多组数据,然后给出一个面额n,已知有5种钱币1, 5 ,10 , 25, 50求可以组成n元的可能数 (同时所花费的钱币个数要小于等于100)

思路:从多重背包来理解,即使每个硬币占一个单位空间,有100个空间通过状态转移方程:dp[j][k] += dp[j-v[i]][k-1]; 这里dp记录的便是组合的种类数(相当于递推公式,

从dp[0][0]这个状态开始,尝试放入不同的硬币并且符合条件)

总母函数的角度:同样相当于取5种类型的硬币,然后通过母函数性质模拟多项式乘积 便可以得到

多重背包完整代码:

#include<cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a[255][105],b[255][105];
int v[6]={0,1,5,10,25,50};
int dp[110][300];
int num[255]={0};
int i,j,k,t,n;
int ans ;
void solve(){
    memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for(int i=1;i<=5;i++)
            for(int j=1;j<=100;j++)
                for(int k=250;k>=v[i];k--)
                    dp[j][k]+=dp[j-1][k-v[i]];
}
int main()
{
    solve();//预处理
    while(~scanf("%d",&n))
    {
        ans= 0;
        for(int i =0;i<=100;i++)
            ans +=dp[i][n];
        printf("%d\n",ans);
    }
    return 0;
}

母函数完整代码:

#include<cstdio>
int a[255][105],b[255][105];
int v[6]={0,1,5,10,25,50};
int num[255]={0};
int i,j,k,t,n;
void solve(){
    a[0][0]=1;
    for(i=1;i<=5;i++)//种类数
    {
        for(j=0;j<=250;j++)//最大额度
            for(k=0;j+k*v[i]<=250;k++)
                for(t=0;t+k<=100;t++)//硬币个数限制
                    b[j+k*v[i]][t+k]+=a[j][t]; 

        for(j=0;j<=250;j++)//赋值与清零
            for(t=0;t<=100;t++)
            {
                a[j][t]=b[j][t];
                b[j][t]=0;
            }
    }
    for(i=0;i<=250;i++)//将系数相加(即为组合可能数)
        for(j=0;j<=100;j++)
            num[i]+=a[i][j];
}
int main()
{
    solve();//预处理
    while(~scanf("%d",&n))
    {
        printf("%d\n",num[n]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Tianwell/p/11214082.html

时间: 2024-10-19 03:37:13

HDU-2016 Coin Change (母函数 | 多重背包)的相关文章

HDU 2069 Coin Change 母函数求解

HDU 2069 Coin Change 母函数求解 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2069 这题比普通的母函数求解题目复杂一点,多了组成个数的限制, 要求组合个数不能超过 100 个硬币,所以将 c1, c2 定义为二维数组, c1[i][j] 表示 c1[结果][组成该结果的个数] ,然后多了一层遍历个数的循环. // 母函数求解 #include <bits/stdc++.h> using namespace std; cons

hdu 2069 Coin Change(完全背包)

Coin Change Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16592 Accepted Submission(s): 5656 Problem Description Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent.

hdu 1171 Big Event in HDU(母函数|多重背包)

http://acm.hdu.edu.cn/showproblem.php?pid=1171 题意:有n种物品,给出每种物品的价值和数目,要将这些物品尽可能的分成相等的两份A和B且A>=B ,输出A,B. 母函数可以过,但感觉最直接的方法应该是多重背包. 母函数的话,也是按总价值的一半求,从一半到小枚举,直到找到系数不为0的就是B. #include <stdio.h> #include <iostream> #include <map> #include <

hdu 2082 找单词(母函数|多重背包)

http://acm.hdu.edu.cn/showproblem.php?pid=2082 每一个字母的价值固定,但数目不定.所以每个字母对应的表达式也不同,若第i个字母的个数为a[i],价值为i,那么它的母函数为(1+x^i+x^(2i)+.....+x^(a[i]*b[i])).那么将i属于[1,26]的母函数相乘得到的x^m(1<=m<=50)的系数相加就是答案. #include <stdio.h> #include <iostream> #include &

UVa 674 &amp; hdu 2069 Coin Change (母函数,dp)

链接:uva 674 题意:有5中货币,价值分别为 50-cent, 25-cent, 10-cent, 5-cent,1-cent,数量都为无限个, 给定一个数 n,求用上述货币组成价值为 n 的方法有多少? 分析:因为n<=7489,可以用 母函数 或 dp 打表 对于dp状态方程为: dp[j]+=dp[j-c[i]] 母函数: #include<stdio.h> int c1[7500],c2[7500],w[5]={1,5,10,25,50};; void mhs() { in

hdu 2069 Coin Change 背包。本来打算用母函数再写一遍的,发现代码极其相似,就没写

Coin Change Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14982    Accepted Submission(s): 5070 Problem Description Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and

杭电1171 Big Event in HDU(母函数+多重背包解法)

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23728    Accepted Submission(s): 8363 Problem Description Nowadays, we all know that Computer College is the biggest department

(简单母函数进阶版,暴力)hdu 2069 Coin Change

Coin Change Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14857    Accepted Submission(s): 5024 Problem Description Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and

HDU 2844 二进制优化的多重背包

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11596    Accepted Submission(s): 4634 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One