**

做完这道题,心里五味陈杂,明明是最水的一道题,我却做了最长的时间。

题意是求用1~k的和表示n的方案数。

显然是个计数dp,但我不会。思考半小时未果。

然后找尹鹏哲,他给我讲了个错的dp方程,结果调试半小时未果,看了别人的代码,发现别人虽然滚了一维,但和尹鹏哲讲的十分相似。

后来我又想了想,觉得尹鹏哲的dp方程有点问题,自己改了一下,但当时并没有验证。实际上,由于对题解方程错误理解,当时我已经形成了思维定势,认为方程是对的,却没有发现方程中一个十分微小但十分致命的错误——我把完全背包和01背包的模型搞混了。正是这个错误,让我调+改又浪费了两个小时。

好了,废话说了这么多,只是想让自己记住这次教训,希望下次不要再犯。(但背包问题的模型又多,变化又复杂,所以只能希望了),下面写题解。

先讲二维的:

设f[i][j]表示用前i个物品,刚好凑出体积j的方案数。这个状态很好想。

然后是转移,就是在这里我的思维出现了偏差。

开始,尹鹏哲告诉我的是f[i][j]+=f[i-1][j-i],这个与一维方程一模一样,显然是不对的,但我太信任尹鹏哲,所以并没有细想。

后来,受尹鹏哲的启发,我自己写出来的方程是f[i][j]=f[i-1][j-i]+f[i-1][j],与组合数的递推关系一样,表示第i件物品选与不选。

这个方程咋看上去没问题,实际上,这道题与组合数有着本质的区别,组合数每个物品只能选一次,而这道题一个数字显然可以用多次。但傻逼的我忽视了这个差别,结果狂WA不止。

换成背包问题的计数的话,组合数实际上是01背包的方案数,而这道题实际上是完全背包的方案数!

所以,dp方程应该为:f[i][j]=f[i][j-i]+f[i-1][j]

滚成一维就很简单了:f[j]+=f[j-i]

实际上,完全背包和01背包的代码十分相似,若碰到一定要想清楚!

另:要打高精度,详见一维代码。**

二维:

#include <bits/stdc++.h>
using namespace std; #define db double
#define ll long long
#define RG register inline int gi()
{
RG int ret; RG bool flag; RG char ch;
ret=0, flag=true, ch=getchar();
while (ch < '0' || ch > '9')
ch == '-' ? flag=false : 0, ch=getchar();
while (ch >= '0' && ch <= '9')
ret=(ret<<3)+(ret<<1)+ch-'0', ch=getchar();
return flag ? ret : -ret;
} const db pi = acos(-1.0);
const int N = 142857, inf = 1<<30; int f[205][2005]; int main()
{
freopen("Dollar_Dayz.in","r",stdin);
freopen("Dollar_Dayz.out","w",stdout);
int n,m,i,j;
n=gi(), m=gi();
f[1][0]=1;
// 两种都可
// for (i=1; i<=m; ++i)
// for (j=0; j<=n; ++j)
// {
// if (j >= i)
// f[i][j]=f[i][j-i];
// f[i][j]+=f[i-1][j];
// }
for (i=1; i<=m; ++i)
for (j=0; j<=n; ++j)
f[i][j+i]+=f[i][j], f[i+1][j]=f[i][j];
printf("%d\n",f[m][n]);
return 0;
}

一维:

#include <bits/stdc++.h>
using namespace std; #define db double
#define ll long long
#define RG register inline int gi()
{
RG int ret; RG bool flag; RG char ch;
ret=0, flag=true, ch=getchar();
while (ch < '0' || ch > '9')
ch == '-' ? flag=false : 0, ch=getchar();
while (ch >= '0' && ch <= '9')
ret=(ret<<3)+(ret<<1)+ch-'0', ch=getchar();
return flag ? ret : -ret;
} const db pi = acos(-1.0);
const int N = 1e3+5, inf = 1<<30;
const ll lim = 1e18; //要开 ll ll f[N],g[N]; int main()
{
freopen("Dollar_Dayz.in","r",stdin);
freopen("std.out","w",stdout);
int n,m,i,j;
n=gi(), m=gi();
g[0]=1;
for (j=1; j<=m; ++j)
for (i=j; i<=n; ++i)
{
f[i]+=f[i-j], g[i]+=g[i-j];
if (g[i] >= lim)
f[i]+=g[i]/lim, g[i]%=lim;
}
if (f[n])
printf("%lld%lld\n",f[n],g[n]);
else
printf("%lld\n",g[n]);
return 0;
}

poj3181【Dollar Dayz】的更多相关文章

  1. 【AR实验室】mulberryAR : ORBSLAM2+VVSION

    本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...

  2. 【.net 深呼吸】细说CodeDom(1):结构大观

    CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...

  3. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  4. 【前端性能】高性能滚动 scroll 及页面渲染优化

    最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...

  5. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  6. 【.net 深呼吸】程序集的热更新

    当一个程序集被加载使用的时候,出于数据的完整性和安全性考虑,程序集文件(在99.9998%的情况下是.dll文件)会被锁定,如果此时你想更新程序集(实际上是替换dll文件),是不可以操作的,这时你得把 ...

  7. 【.net 深呼吸】跨应用程序域执行程序集

    应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...

  8. 【Web动画】SVG 实现复杂线条动画

    在上一篇文章中,我们初步实现了一些利用基本图形就能完成的线条动画: [Web动画]SVG 线条动画入门 当然,事物都是朝着熵增焓减的方向发展的,复杂线条也肯定比有序线条要多. 很多时候,我们无法人工去 ...

  9. 【Web动画】SVG 线条动画入门

    通常我们说的 Web 动画,包含了三大类. CSS3 动画 javascript 动画(canvas) html 动画(SVG) 个人认为 3 种动画各有优劣,实际应用中根据掌握情况作出取舍,本文讨论 ...

随机推荐

  1. javascript --- 构造器借用

    接下来我们在看一种继承的实现.这需要再次利用构造器函数入手,这回不直接使用对象了.由于在这种继承模式中,子对象构造器可以通过call()和apply()方法来调用父对象的构造器.因而可以被称作构造器盗 ...

  2. fastscripT实现权限控制

    fastscripT权限控制 此处以FASTSCRIPT实现功能权限为例,用脚本实现数据权限也是很方便的. unit Unit1; interface uses Winapi.Windows, Win ...

  3. 手动安装windows的磁盘清理工具

    All you really need to do is copy some files that are already located on your server into specific s ...

  4. Android onCreate 的savedInstanceState 作用

    在activity的生命周期中,只要离开了可见阶段,或者说失去了焦点,activity就很可能被进程终止了!,被KILL掉了,,这时候,就需要有种机制,能保存当时的状态,这就是savedInstanc ...

  5. 机器学习(十三)——机器学习中的矩阵方法(3)病态矩阵、协同过滤的ALS算法(1)

    http://antkillerfarm.github.io/ 向量的范数(续) 范数可用符号∥x∥λ表示. 经常使用的有: ∥x∥1=|x1|+⋯+|xn| ∥x∥2=x21+⋯+x2n−−−−−− ...

  6. List&lt;InvestInfoDO&gt; invest = advertiseDao6.qryInvestInfo(InvestInfoDO1);怎样获得list的实体类;

    List<InvestInfoDO>  invest = advertiseDao6.qryInvestInfo(InvestInfoDO1); 怎样获得List的实体类呢,就是怎样获得I ...

  7. 如何使用Medieval CUE Splitter分割ape,合并ape,制作cue

    1 下载并运行这个软件,点击打开CUE文件,然后找到需要打开的CUE文件.   2 软件会立即弹出一个再次要求打开APE文件的对话框.打开之后会发现APE音乐已经被分割成了一小段一小段.   3 点击 ...

  8. Eclipse 安装(Oxygen版本)

    Eclipse 安装(Oxygen版本) Eclipse 最新版本 Eclipse Neon,这个首次鼓励用户使用 Eclipse Installer 来做安装,这是一种由Eclipse Oomph提 ...

  9. 【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)

    两个月之前准备软考时,简单的从理论上总结了最经常使用的数据结构和算法,比方:线性表,链表,图.在进行java开发时,jdk为我们提供了一系列对应的类来实现主要的数据结构.jdk所提供的容器API位于j ...

  10. 使用Pig对手机上网日志进行分析

    在安装成功Pig的基础上.本文将使用Pig对手机上网日志进行分析,详细过程例如以下: 写在前面: 手机上网日志文件phone_log.txt.文件内容 及 字段说明部分截图例如以下 需求分析 显示每一 ...