http://poj.org/problem?id=3181

这个题目一开始就能看出来是个dp问题,但是我并没有一开始就看出来是一个完全背包为题,只是想着根据以前的方法,这个问题应该是可以找到规律的,但是,还是被坑了,这还是一个大数问题!

首先我膜拜一下hankcs大神的:

///////////////////////////////////////////////////////////

  1. #include <iostream>
  2. using namespace std;
  3. unsigned long long dp[100 + 16][1000 + 16]; // dp[i][j] := 用i种价格配出金额j的方案数
  4. ///////////////////////////SubMain//////////////////////////////////
  5. int main(int argc, char *argv[])
  6. {
  7. #ifndef ONLINE_JUDGE
  8. freopen("in.txt", "r", stdin);
  9. freopen("out.txt", "w", stdout);
  10. #endif
  11. int N, K;
  12. cin >> N >> K;
  13. dp[0][0] = 1;
  14. for (int i = 1; i <= K; ++i)
  15. {
  16. for (int k = 0; k <= N; k += i)
  17. {
  18. for (int j = N; j >= k; --j)
  19. {
  20. dp[i][j] += dp[i - 1][j - k];
  21. }
  22. }
  23. }
  24. cout << dp[K][N] << endl;
  25. #ifndef ONLINE_JUDGE
  26. fclose(stdin);
  27. fclose(stdout);
  28. system("out.txt");
  29. #endif
  30. return 0;
  31. }
  32. ////////////////////////////////////////////////////////////

  hancks的这个做法是用完全背包

  dp[i][j] = dp[i – 1][j] + dp[i – 1][j – i] + dp[i – 1][j – 2 * i] + … + dp[i – 1][0]

  由这个公式可以再递推:  

将j换成j – i有

dp[i][j – i] = dp[i – 1][j – i] + dp[i – 1][j – 2 * i] + … + dp[i – 1][0]

得出:if j >= i:

  dp[i][j] = dp[i-1][j] + dp[i][j-i];

  我的做法是一开始就推出了这个公式,因为不小心看出了这个规律

    i:1->4 ,j :1->5 dp[i][j]规律是这样的

    1 1 1 1 1

    1 2 2 3 3

    1 2 3 4 5

    1 2 3 4 6

    得出了j >= i : dp[i][j] = dp[i-1][j] + dp[i][j-i] 

    然而,这还是个大数问题,即使unsigned long long 都不行,开始一直没想通!

/*************************************************************************
> File Name: DollarDayz_poj3181.cpp
> Author: spzhao
> Mail: spzhaol@163.com
> Created Time: 2015年10月14日 星期三 11时13分22秒
************************************************************************/ #include<iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> #define mod 10000000000000000
using namespace std; const int N = 1005;
const int K = 105;
unsigned long long dp[100+16][1000+16][2];
int n,k;
void solve()
{
for (int i = 1;i <= k;i++)
{
for (int j = 1;j <= n;j++)
{
if (j >= i)
{
dp[i][j][0] = dp[i-1][j][0]+dp[i][j-i][0];
dp[i][j][1] = dp[i-1][j][1]+dp[i][j-i][1];
dp[i][j][0] += dp[i][j][1]/mod;
dp[i][j][1] = dp[i][j][1]%mod;
}
else
{
dp[i][j][0] = dp[i-1][j][0];
dp[i][j][1] = dp[i-1][j][1];
}
}
}
if (dp[k][n][0])
cout << dp[k][n][0];
cout << dp[k][n][1] << endl;
}
int main ()
{
cin >> n >> k;
memset(dp,0,sizeof(dp));
dp[1][0][1] = 1;
for (int i = 1;i <= k;i++)
dp[i][0][1] = 1;
solve();
return 0;
}

  

 

Dollar Dayz poj3181的更多相关文章

  1. Dollar Dayz(大数母函数,高低位存取)

    Dollar Dayz Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5655   Accepted: 2125 Descr ...

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

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

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

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

  4. poj3181 Dollar Dayz

    Description Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of to ...

  5. poj3181 Dollar Dayz ——完全背包

    link:http://poj.org/problem?id=3181 本来很常规的一道完全背包,比较有意思的一点是,结果会超int,更有意思的解决方法是,不用高精度,用两个整型的拼接起来就行了.OR ...

  6. poj3181【Dollar Dayz】

    做完这道题,心里五味陈杂,明明是最水的一道题,我却做了最长的时间. 题意是求用1-k的和表示n的方案数. 显然是个计数dp,但我不会.思考半小时未果. 然后找尹鹏哲,他给我讲了个错的dp方程,结果调试 ...

  7. (完全背包 大数)Dollar Dayz (POJ 3181)

    http://poj.org/problem?id=3181 Description Farmer John goes to Dollar Days at The Cow Store and disc ...

  8. bzoj1655 [Usaco2006 Jan] Dollar Dayz 奶牛商店

    Description Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of to ...

  9. 【BZOJ】1655: [Usaco2006 Jan] Dollar Dayz 奶牛商店(背包+高精度)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1655 背包就没什么好说的了,裸的完全背包.. 但是我一开始交开了ull都wa了T_T.. 精度太大. ...

随机推荐

  1. 棒!使用.NET Core构建3D游戏引擎

    原文地址:https://mellinoe.wordpress.com/2017/01/18/net-core-game-engine/ 作者:ERIC MELLINO 翻译:杨晓东(Savorboa ...

  2. Hadoop权威指南: InputFormat,RecordReader,OutputFormat和RecordWriter

    InputFormat和RecordReader Hadoop提出了InputFormat的概念 org.apache.hadoop.mapreduce包里的InputFormat抽象类提供了如下列代 ...

  3. (三)Lua脚本语言入门

    又要找工作了,变的忧虑了,唯有学习才让内心变得踏实,今天玩了一下午的王者荣耀,正事都忘了...... 如果认为所谓的毅力是每分每秒的"艰苦忍耐"式的奋斗,那这是一种很不足的心理状态 ...

  4. JDK分析工具&JVM垃圾回收(转)

    转自:http://blog.163.com/itjin45@126/blog/static/10510751320144201519454/ 官方手册:http://docs.oracle.com/ ...

  5. 初探Lambda表达式/Java多核编程【1】从集合到流

    从集合到流 接上一小节初探Lambda表达式/Java多核编程[0]从外部迭代到内部迭代,本小节将着手使用"流"这一概念进行"迭代"操作. 首先何为" ...

  6. ORACLE_INSERT

    Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...

  7. 笑谈ArcToolbox (1) ArcToolbox 的发展方向

    笑谈ArcToolbox (1) ArcToolbox 的发展方向 by 李远祥 ArcGIS工具箱ArcToolbox具有非常多的工具,相信用过的人都非常惊叹,其功能完备并且强大,种类繁多,总能找到 ...

  8. Windows下搭建HTTP/HTTPS服务器及测试过程

    1 安装Apache http://www.apachehaus.com/cgi-bin/download.plx 选择合适的版本下载 本次下载的是 Apache 2.4.x VC14 Apache版 ...

  9. 使用 flow.ci 快速发布你的项目文档

    软件研发的协作过程中,文档是必不可少的一环,有需求文档.接口文档.使用文档等等.当开始写文档时,首先会遇到两个问题: team members 之间如何协作? 文档 OK 后如何分发,去哪里看?如何更 ...

  10. 如何一步一步用DDD设计一个电商网站(十四)—— 回顾与总结

    本系列所有文章 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念 如何一步一步用DDD设计一个电商网站(二)—— 项目架构 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域 如 ...