这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. Spark大型项目实战:电商用户行为分析大数据平台

    本项目主要讲解了一套应用于互联网电商企业中,使用Java.Spark等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分 ...

  2. UVA 565 565 Pizza Anyone? (深搜 +位运算)

      Pizza Anyone?  You are responsible for ordering a large pizza for you and your friends. Each of th ...

  3. System.getProperty("catalina.home")

    System.getProperty("catalina.base"),服务器配置目录

  4. 将markdown格式转化为bootstrap风格html

    前言:这些年markdown格式的文件很流行,像github里project说明文档都是用markdown格式编写. 一方面,我们能够通过pandoc将markdown文件转换为html,这样将htm ...

  5. protobuf-2.5.0.tar.gz的下载与安装

    1.下载 hadoop使用protocol buffer进行通信,须要下载和安装protobuf-2.5.0.tar.gz.因为如今protobuf-2.5.0.tar.gz已经无法在官网https: ...

  6. Python 新浪微博元素 (Word, Screen Name)词汇多样性

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-10 @author: guaguastd @name: w ...

  7. 简单的RPC java实现

    RPC的名声大噪之时是在2003年,那一个“冲击波”病毒(Blaster Worm virus)袭卷全球的一年.而“冲击波”正是用着RPC这把刀来敲开了远程电脑的大门.当然RPC 有更多正面的应用,比 ...

  8. form不提交问题

    var confirmOrderForm=document.getElementById("confirmOrderForm"); var url="${pageCont ...

  9. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  10. cocos2d-x中使用JNI的调用JAVA方法

    用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化 ...