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. C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)

    前言:大过年的,写篇文章不容易,还是给自己点个赞~~年前找了下.net安装包的制作方法,发现Visual Studio自带的制作工具使用起来非常麻烦,需要单独下载安装包,并且什么激活认证等等屁事相当麻 ...

  2. Hibernate调用带有输入参数,输出参数为cursor的存储过程

    一.Oracle创建表及存储过程 1.创建表T_MONITOR_DEVICE 创建后的表结构 2.创建存储过程 create or replace procedure ProcTestNew(v_mo ...

  3. js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( ))

    ( function(){…} )() ( function (){…} () ) 是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达 ...

  4. Javascript前端面试题

    在网上看到了一些Javascript的面试题就整理了下来,后续看到再继续补充. 面试题按类型来分,主要涉及到"技术"与"非技术"两大类,技术类别下涉及到的子类别 ...

  5. assign和weak的深层次解析

    我们知道在设置类的属性时,控件一般中weak,对象一般用strong,数据类型一般使用assign,其中weak和assign都不会使计数器增加,那为什对象不可以使用assign呢? weak与ass ...

  6. TypeScript和JavaScript哪种语言更先进

    TypeScript和JavaScript哪种语言更先进 近两年来最火爆的技术栈毫无争议的是JavaScript,随着ES6的普及,不管是从前端的浏览器来看,还是后端的NodeJS场景,JavaScr ...

  7. C语言一维数组转换为二维数组

    一维转二维代码示例: #include <stdio.h> #include <stdlib.h> #define ROW 3 #define COL 2 int main(i ...

  8. Maven入门-4.Maven的依赖

    1.Maven的依赖1.1 添加依赖1.2 依赖范围(sope)依赖范围与classpath的关系1.3 依赖的传递性1.2.1 依赖传递性的冲突问题1. 第一种情况2. 第二种情况1.2.2 通过e ...

  9. css中书写小三角

    我们在开发过程中,有很多的方向标签不是图片,而是用css方法书写上去的. 首先我们要了解原理,border的边框的脚步是45度角. 向左方向: width:0px: height:0px: borde ...

  10. vue路由表(简单)

    import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter) const first = { template: ...