这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的更多相关文章

  1. POJ 3181 Dollar Dayz(全然背包+简单高精度加法)

    POJ 3181 Dollar Dayz(全然背包+简单高精度加法) id=3181">http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币各自 ...

  2. POJ 3181 Dollar Dayz && Uva 147 Dollars(完全背包)

    首先是 Uva 147:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_p ...

  3. poj 3181 Dollar Dayz(完全背包)

    Dollar Dayz Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5419   Accepted: 2054 Descr ...

  4. POJ 3181 Dollar Dayz DP

    f[i][j]=f[i-j][j]+f[i][j-1],结果很大需要高精度. //#pragma comment(linker, "/STACK:1024000000,1024000000& ...

  5. poj 3181 Dollar Dayz (整数划分问题---递归+DP)

    题目:http://poj.org/problem?id=3181 思路:将整数N划分为一系列正整数之和,最大不超过K.称为整数N的K划分. 递归:直接看代码: 动态规划:dp[i][j]:=将整数i ...

  6. POJ 3181 Dollar Dayz(高精度 动态规划)

    题目链接:http://poj.org/problem?id=3181 题目大意:用1,2...K元的硬币,凑成N元的方案数. Sample Input 5 3 Sample Output 5 分析: ...

  7. POJ 3181 Dollar Dayz ( 完全背包 && 大数高精度 )

    题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种 分析 : 完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的 故状态转移方程为 dp[i] ...

  8. POJ 3181 Dollar Dayz (完全背包,大数据运算)

    题意:给出两个数,n,m,问1~m中的数组成n,有多少种方法? 这题其实就相当于 UVA 674 Coin Change,求解一样 只不过数据很大,需要用到高精度运算... 后来还看了网上别人的解法, ...

  9. poj 3181 Dollar Dayz

    题意:给定一个数p,要求用K种币值分别为1,2,3...K的硬币组成p,问方案数,1,2,2和2,2,1算一种方案即与顺序无关,n <= 1000,k <= 100// 用完全背包做了 这 ...

随机推荐

  1. 14.2.1 MySQL and the ACID Model

    14.2 InnoDB Concepts and Architecture InnoDB 概念和结构体系: 14.2.1 MySQL and the ACID Model 14.2.2 InnoDB ...

  2. [置顶] Embedded Server:像写main函数一样写Web Server

    1.传统的JEE Web Server 传统的JEE中,如果我们想要部署一个Web Application,我们需要首先安装一个Container Server,如JBoss,WebLogic,Tom ...

  3. mojo 关闭utf8

    [root@wx03 ~]# cat test.pl use Mojolicious::Lite; use JSON qw/encode_json decode_json/; use Encode; ...

  4. [Codecademy] HTML&CSS 第一课:HTML Basic

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  5. HDU 4296 Buildings (YY)

    题意: 给定N个物体,每个物体有两个参数w,s.   w代表它自身的重量: s代表它的强度.现在要把这些物体叠在一起,会产生一个PDV值. PDV解释:(Σwj)-si, where (Σwj) st ...

  6. SINGLETON(单例模式)---(孤独的人)

    很多时候,我们都很彷徨,因为,在身边的朋友,很少. package patterns.createable.singleton; /** * 孤独的人啊 * 我为你写了一个类 * 这个类,在我们的程序 ...

  7. html中加入超链接方式的汇总

    在CSS样式中,对超链接的样式有以下几种定义(1)设置链接未被访问时的样式,具体写法如下:a:link{font-size:10px;... }(2)设置链接在鼠标经过时的样式,具体写法如下:a:ho ...

  8. 与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏

    原文:与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏 [索引页][源码下载] 与众不同 wind ...

  9. 如何debug ruby

    how to debug ruby: 1. 第一种方法,直接使用ruby内建的debug在命令行调试,这个个gdb或者pdb的命令差不多. ruby -r debug yourubyfile.rb 2 ...

  10. Java输出当前的日期(年月日时分秒毫秒)

    package test.remote.tools.combine; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...