POJ 3181 Dollar Dayz 简单DP
这DP虽然简单
但是思考一下还是挺好的
题意是
1,2,3,4....k 用加法凑成N
每个数可取不限个数
令dp[i][j] 表示前i种数凑成j的方案数
然后dp[i][j] = dp[i - 1][j] + dp[i - 1][j - i] + dp[i - 1][j - 2 * i]........dp[i - 1][j - k * i]
这样子
然后代码如下,由于结果要爆long long ,所以用两个long long 数存高位和低位
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define MAXN 111111
#define INF 1000000007
using namespace std;
pair<long long, long long> dp[111][1111];
long long mod = 10000000000000000LL;
int n, m;
int main()
{
scanf("%d%d", &n, &m);
dp[0][0].second = 1;
dp[0][0].first = 0;
for(int i = 1; i <= m; i++)
{
for(int j = 0; j <= n; j++)
for(int k = j; k >= 0; k -= i)
{
dp[i][j].first += dp[i - 1][k].first;
dp[i][j].second += dp[i - 1][k].second;
if(dp[i][j].second >= mod)
{
dp[i][j].first += dp[i][j].second / mod;
dp[i][j].second %= mod;
}
}
}
if(dp[m][n].first > 0)
printf("%I64d%I64d\n", dp[m][n].first, dp[m][n].second);
else printf("%I64d\n", dp[m][n].second);
return 0;
}
然后就是优化一下
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - i] + dp[i - 1][j - 2 * i]........dp[i - 1][j - k * i]
其实可以发现
dp[i][j - k * i] 与dp[i][j - (k - 1)i] 之间是可以转移的
无非是多用了一个i而已
那么优化成了dp[i][j] = dp[i - 1][j] + dp[i][j - i]
dp[i - 1][j] 代表的是前i-1种数凑成j的方案数
dp[i][j - i]代表的是是用了前i种数凑成j - i的方案数
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define MAXN 111111
#define INF 1000000007
using namespace std;
pair<long long, long long> dp[111][1111];
long long mod = 10000000000000000LL;
int n, m;
int main()
{
scanf("%d%d", &n, &m);
dp[0][0].second = 1;
dp[0][0].first = 0;
for(int i = 1; i <= m; i++)
{
for(int j = 0; j <= n; j++)
{
dp[i][j] = dp[i - 1][j];
if(j - i < 0) continue;
dp[i][j].first += dp[i][j - i].first ;
dp[i][j].second += dp[i][j - i].second;
if(dp[i][j].second >= mod)
{
dp[i][j].first += dp[i][j].second / mod;
dp[i][j].second %= mod;
}
}
}
if(dp[m][n].first > 0)
printf("%I64d%I64d\n", dp[m][n].first, dp[m][n].second);
else printf("%I64d\n", dp[m][n].second);
return 0;
}
然后还能优化的就是空间了
观察转移方程
dp[i][j] = dp[i - 1][j] + dp[i][j - i]
发现只跟i和i-1有关系
并且和i - 1有关系得时候跟j没关系
也就是可以用一个一维的状态转移方程就行了
dp[j] = dp[j] + dp[j - i]
其中dp[i - 1][j]实际上在i - 1 循环后已经隐含的转移到了dp[i][j]中了
也就是dp[j]
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define MAXN 111111
#define INF 1000000007
using namespace std;
pair<long long, long long> dp[1111];
long long mod = 10000000000000000LL;
int n, m;
int main()
{
scanf("%d%d", &n, &m);
dp[0].second = 1;
dp[0].first = 0;
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
if(j - i < 0) continue;
dp[j].first += dp[j - i].first ;
dp[j].second += dp[j - i].second;
if(dp[j].second >= mod)
{
dp[j].first += dp[j].second / mod;
dp[j].second %= mod;
}
}
}
if(dp[n].first > 0)
printf("%I64d%I64d\n", dp[n].first, dp[n].second);
else printf("%I64d\n", dp[n].second);
return 0;
}
POJ 3181 Dollar Dayz 简单DP的更多相关文章
- POJ 3181 Dollar Dayz(全然背包+简单高精度加法)
POJ 3181 Dollar Dayz(全然背包+简单高精度加法) id=3181">http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币各自 ...
- POJ 3181 Dollar Dayz && Uva 147 Dollars(完全背包)
首先是 Uva 147:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_p ...
- poj 3181 Dollar Dayz(完全背包)
Dollar Dayz Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5419 Accepted: 2054 Descr ...
- POJ 3181 Dollar Dayz DP
f[i][j]=f[i-j][j]+f[i][j-1],结果很大需要高精度. //#pragma comment(linker, "/STACK:1024000000,1024000000& ...
- poj 3181 Dollar Dayz (整数划分问题---递归+DP)
题目:http://poj.org/problem?id=3181 思路:将整数N划分为一系列正整数之和,最大不超过K.称为整数N的K划分. 递归:直接看代码: 动态规划:dp[i][j]:=将整数i ...
- POJ 3181 Dollar Dayz(高精度 动态规划)
题目链接:http://poj.org/problem?id=3181 题目大意:用1,2...K元的硬币,凑成N元的方案数. Sample Input 5 3 Sample Output 5 分析: ...
- POJ 3181 Dollar Dayz ( 完全背包 && 大数高精度 )
题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种 分析 : 完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的 故状态转移方程为 dp[i] ...
- POJ 3181 Dollar Dayz (完全背包,大数据运算)
题意:给出两个数,n,m,问1~m中的数组成n,有多少种方法? 这题其实就相当于 UVA 674 Coin Change,求解一样 只不过数据很大,需要用到高精度运算... 后来还看了网上别人的解法, ...
- poj 3181 Dollar Dayz
题意:给定一个数p,要求用K种币值分别为1,2,3...K的硬币组成p,问方案数,1,2,2和2,2,1算一种方案即与顺序无关,n <= 1000,k <= 100// 用完全背包做了 这 ...
随机推荐
- Mysql 执行计划分析
zjdev 正常访问: mysql> explain SELECT temp.* , -> (SELECT COUNT(sn) FROM AssignClientManager WHERE ...
- TVS參数具体解释及选型应用
一.首先了解TVS管的參数,我们以littelfuse的5.0SMDJ系列为例. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGcybGg=/font/ ...
- 与众不同 windows phone (11) - Background Task(后台任务)之警报(Alarm)和提醒(Reminder)
原文:与众不同 windows phone (11) - Background Task(后台任务)之警报(Alarm)和提醒(Reminder) [索引页][源码下载] 与众不同 windows p ...
- 【Node.js 自己封装的库 http_parse, libuv】
[Node.js 自己封装的库 http_parse, libuv] Node.js 介绍:一个网络框架,更多:http://www.oschina.net/p/nodejs 官网:http://no ...
- <摘录>详谈高性能TCP服务器的开发
对于开发一款高性能服务器程序,广大服务器开发人员在一直为之奋斗和努力.其中一个影响服务器的重要瓶颈就是服务器的网络处理模块.如果一款服务器程序不能及时的处理用户的数据.则服务器的上层业务逻辑再高效也是 ...
- 联想A800新蜂ROM V1.1 基于官方4.0.4精简省电稳定
ROM介绍 [出品]:新蜂工作室(基于官方) 1.源于官方:基于最稳定官方底包制作. 2.深度精简:自带APK数量从原厂包的131个降低到90个,精简31% 3.ROM包大小从原厂314MB精简到16 ...
- 玩转Windows服务系列——服务运行、停止流程浅析
原文:玩转Windows服务系列——服务运行.停止流程浅析 通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大 ...
- Python批量删除指定目录下的指定类型的文件
Python作为一种脚本语言.其很适合文件级的各种操作.以下的代码能够批量删除指定目录下的所有特定类型(CSV类型)的文件. import sys, csv , operator import os ...
- _tcscat在Debug和Release根据问题
背景: 因此,例如,在下面的代码段,作用是得到的路径当前程序(C:\work\A.exe),然后"A.exe"拆除,组装的"C:\work\inject.dll" ...
- CSS3 Media Query实现响应Web设计(宽度为不同的移动设备)
现在的屏幕分辨率.小到320px(iPhone),大到2560px或甚至更高(大显示屏).范围内变化很大.除了使用传统的台式机.用户会越来越多的通过手机.上网本.iPad一类的平板设备来浏览页面. 这 ...