hdu 1284 dp
hdu 1284 dp
这题有很多种解法,可以用dp(包括从子问题推的和完全),母函数,分裂整数(这个还不了解),找规律等
下面给出其中一些方法的代码
//hdu 1284 找规律 //给出n 看能n 内有多少个 2 和多少个3 //具体看代码和一下注视 #include <stdio.h> #include <string.h>#define N 35000__int64 ans[N];int main() {int n; // 计算i 可以由多少个 2 组成for(int i = 0; i < N; ++i)// 后面的 +1 表示全由1组成的(只有1中情况)ans[i] = i / 2 + 1; //则这一行表示由 2组成的情况加上由1组成的情况// 从前面往后推,看能由几个3 组成,比如 ans[3]表示钱为3时 // 由1,2分硬币组成的情况,可以表示成钱为0 时加上一个3分硬币(这时方法数为 // 钱为 0 时由1,2,3组成的情况 加上钱为3时由1,2组成的方法数) // 因此 ans[i] += ans[i-3]+1;不需要后面的+1for(int i = 3; i < N; ++i)ans[i] += ans[i-3];//这一行ans[i]就表示由2组成的情况加上由3组成的情况 // ans[6]就相当于由2组成的情况ans[6] 加上 由1,2,3组成的情况的ans[6-3] // 这样往后推,就可以把 由3分组成的情况加上去while(scanf("%d", &n) != EOF)printf("%I64d\n", ans[n]);return 0; }
dp(完全背包)//dp(完全背包) #include <stdio.h> #include <string.h>#define N 35000int dp[N];int main() {dp[0] = 1;for(int i = 1; i <= 3; ++i){ //背包容量为N,装入质量为i 的物品for(int j = i; j < N; ++j){dp[j] += dp[j-i];}}int n;while(scanf("%d", &n) != EOF)printf("%d\n", dp[n]);return 0; }
//hdu 1284 母函数// 1分的 2分的 3分的 //母函数计算:(1+x+x^2+x^3+...)*(1+x^2+x^4+...)*(1+x^3+x^6+...) //n 分钱要分解的方法则为 多项式相乘后 指数为n 的系数 #include <stdio.h> #include <string.h>#define N 35000int ans[N], mul[N];int main() {for(int i = 0; i < N; ++i)ans[i] = 1; //全用1分组成的方法都只有1种for(int i = 2; i <= 3; ++i){for(int j = 0; j < N; ++j){ //系数都为1for(int k = 0; j+k < N; k += i) //( 1 + x^k + x^(k+i) + x^(k+2i) + ... ){ //指数分别为j 和k 的多项式相乘 得到指数为 j+k项,所以第j项乘以第k项mul[j+k] += ans[j]; // 得到 j+k项 的系数为 j项的加上原本 j+k项的系数 }}for(int j = 0; j < N; ++j){ans[j] = mul[j]; //把系数保存到 ans数组里mul[j] = 0; //初始化 }}int n;while(scanf("%d", &n) != EOF){printf("%d\n", ans[n]);}return 0; }
转载于:https://www.cnblogs.com/gabo/archive/2012/04/18/2454675.html
hdu 1284 dp相关推荐
- HDU 5928 DP 凸包graham
给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...
- hdu 1171 dp(多重背包)
View Code //hdu 1171 dp(多重背包)//题意:把所有物品的价值尽量分为相等的两份,不能等分的话 //后面那份可以稍小于前面的 //求出价值总和后,令价值的一半为背包容量,让背包尽 ...
- hdu 1284 钱币兑换问题
hdu 1284 钱币兑换问题 母函数 //hdu 1284 母函数// 1分的 2分的 3分的 //母函数计算:(1+x+x^2+x^3+...)*(1+x^2+x^4+...)*(1+x^3+x^ ...
- HDU - 1284 钱币兑换问题 (找规律/完全背包)
Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Out ...
- HDU 4832(DP+计数问题)
HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行.竖用几行,然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...
- hdu 5086(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5086 题目大意:给出长度为n的数组,然后要求累计里面的每个子串的和. 解题思路:这道题直接枚举肯定不行 ...
- hdu 2059(dp)
龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Des ...
- HDU 3646 DP + 二分
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3646 题意:你有N把武器,每把武器可以对敌人造成一定的伤害(et:攻击力500,敌人血量为200,杀死敌人 ...
- Hdu 4293 DP
题意: n个人说自己前面有多少人 后面有多少人 求出说真话人数最多的情况 每个样例有 一个 n 表示n个人 接下来 n 行有a b 表示他前面的人数和后面的人数 思路: 如果已经知道了其中一组的人数~ ...
- hdu 3905(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3905 思路:dp[i][j]表示前i分钟,睡了j分钟收获的的最大价值,并记tmp_dp[i][j]为从 ...
最新文章
- VS2010程序打包操作
- python qcut_Python之Pandas库学习(三):数据处理
- java求质数为什么%3ci 2_C语言程序设计部分习题及例题参考程序
- fsync与fflush的关系和区别
- 不要62(HDU-2089)
- 程序员的算法课(12)-使用通配符*,?等来查找字符串
- Python机器学习:多项式回归001什么是多项式回归
- mysql innodb trx_如何区分MySQL的innodb_flush_log_at_trx_commit和sync_binlog
- Java第二次作业程序设计作业
- 【数据库原理实验(openGauss)】认识DBMS系统
- 【转】从CSDN的趣味题学C# 3.0
- Linux系统grep查日志用法
- 七十三、分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect传递参数...
- 软件测试报告模板什么样的?
- 我裂了,换领导后,竟然每天都要写日报
- 著者四角号码查询_著者姓名汉语拼音与四角号码数字混编书次号的应用
- [MATLAB]--数据插值(interp1/2多维插值)
- 基于微信小程序开发的demo
- Redis缓存击穿,穿透,雪崩等问题
- 数据挖掘学习笔记:标称属性(名词性)的邻近性度量