HDU 2069二维母函数

显然母函数,有一个地方需要注意。当输入0时,只有一种方法,所以输出1。

代码:


 1 #include <stdio.h>
2 #include <string.h>
3 #include <algorithm>
4 #include <iostream>
5 using namespace std;
6 int c1[255][111], c2[255][111];
7 main()
8 {
9
10 int n, i, j, k, l;
11 int a[]={0,1,5,10,25,50};
12 while(scanf("%d",&n)!=EOF)
13 {
14 if(n==0){ //n==0
15 cout<<1<<endl;
16 continue;
17 }
18 memset(c1,0,sizeof(c1));
19 memset(c2,0,sizeof(c2));
20 for(i=0;i<=n&&i<=100;i++) //初始边界
21 c1[i][i]=1;
22 for(i=2;i<=5;i++)
23 {
24 for(j=0;j<=n;j++)
25 {
26 for(k=0;k*a[i]+j<=n;k++)
27 for(l=0;l+k<=100;l++)
28 c2[k*a[i]+j][l+k]+=c1[j][l];
29 }
30 for(k=0;k<=n;k++)
31 {
32 for(l=0;l<=100;l++)
33 {
34 c1[k][l]=c2[k][l];
35 c2[k][l]=0;
36 }
37 }
38 }
39 int sum=0;
40 for(l=0;l<=100;l++)
41 sum+=c1[n][l];
42 printf("%d\n",sum);
43 }
44 }

HDU 2069二维母函数,布布扣,bubuko.com

时间: 2024-10-29 00:15:14

HDU 2069二维母函数的相关文章

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 2159FATE(二维背包)

题目地址:HDU 2159 二维的背包,刚开始用的一维,老感觉哪里不对,有两个制约因素.于是就改成了二维的,就过了.. 代码如下: #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <sta

HDU 1823 二维线段树(区间max)

Luck and Love Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5262    Accepted Submission(s): 1317 Problem Description 世界上上最远的距离不是相隔天涯海角而是我在你面前可你却不知道我爱你                ―― 张小娴 前段日子,枫冰叶子给Wiskey做了

HDU 1892 二维树状数组

See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3485    Accepted Submission(s): 1103 Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many kno

hdu 4819 二维线段树模板

/* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 1010; int N, Q; struct Nodey { int l, r; int Max, Min; }; int locx[MAXN], l

HDU 3496 (二维费用的01背包) Watch The Movie

多多想看N个动画片,她对这些动画片有不同喜欢程度,而且播放时长也不同 她的舅舅只能给她买其中M个(不多不少恰好M个),问在限定时间内观看动画片,她能得到的最大价值是多少 如果她不能在限定时间内看完买回来的动画片,则输出0 这里借用大牛的背包九讲的讲义,讲的很清楚 问题 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物品可以得到最大的价值.设这两种代价分别为代价1和代价2,第i件物品所需的两种

HDU 1823 二维线段树

二维线段树入门题 分别以身高和活泼度开两维 以身高-100,活泼度*10,为两个区间 所谓的二维就是在第一维查找到正确位置时,进入第二维再查找 #include "stdio.h" #include "string.h" double ans; double Max(double a,double b) { if (a<b) return b;else return a; } struct Mark { int l,r; double x; }; struct

hdu 3496 二维费用的01背包

算是比较简单的二维费用背包了吧,注意在某一维上要求“装满”. 另外:对于多维费用的背包,最内层的循环可以逆着写,想一想,为什么. 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 7 const int INF = -99999999; 8 const int N = 101; 9 con

hdu 2159 二维完全背包

背景:二维数组为限制条件的完全背包,1Y. 思路:转移方程:F[i][j]=max{F[i][j],F[i-1][j-C[k]+W[k]},F[i][j]为在i为最大人数为i,最大忍耐度为j的情况下所能达到的最大经验值.一旦经验值达到目标要求经验值,就记录当前罪恶值,找出所有大到经验要求罪恶值中的最小罪恶值即可. 学习:进化仍然是转移方程的确立,背包类问题,按照模型进行变换就好.找到限制条件和物品选择,对限制条件进行拆分为每种可能的离散块. 我的代码: #include<cstdio> #in