Sumsets

Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 400000/200000K (Java/Other)
Total Submission(s) : 4   Accepted Submission(s) : 3
Problem Description
Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows use only numbers that are an integer power of 2. Here are the possible sets of numbers that sum to 7:

1) 1+1+1+1+1+1+1
2) 1+1+1+1+1+2
3) 1+1+1+2+2
4) 1+1+1+4

5) 1+2+2+2
6) 1+2+4

Help FJ count all possible representations
for a given integer N (1 <= N <= 1,000,000).

 
Input
A single line with a single integer, N.
 
Output
The number of ways to represent N as the indicated sum.
Due to the potential huge size of this number, print only last 9 digits (in base
10 representation).
 
Sample Input
7
 
Sample Output
6
 

1) 模型和数据结构就不说了 
2) 算法。以S(n)表示数n的表示方法数。虽然直觉告诉你很可能是动态规划,但第一步肯定是找规律,可能是动态规划,也可能只是普通的一个表达式而已。这里说一下找规律的感想:思维总是趋向于无序状态,所以处理问题一定要有原则,否则大脑就东想西想找不到入口(当然锻炼久了,思维习惯了有序思考就不觉得这是个很重要的问题),找规律的原则就是:一定要“动静结合”!静,就是枚举多个状态出来,直接找他们之间的规律;动,就是从当前状态,改变条件,体!会!状态是如何变化到下一种状态的,这对找规律很有帮助。往往只借助“静”的方法是“看”不出规律的,规律蕴含在变化之中。 
首先,找到以例题那种方式枚举一个数的所有可能的表示方法的规律,这里略过。 
其次,寻找两个数的表示方法数之间的规律。很明显可以发现n是奇数的时候,S(n)=S(n-1) 
当n是偶数的时候呢?观察n从7到8的变化过程。 
 
7到8,就是在7的基础上加一个1,现在把1加上去:注意,加上1之后就可以变化了! 
 
加的这个1,可以和原来奇数中单出来的1组合成2!整理下如下图所示: 
 
嗯,下一步该怎么办?应该找n=7和n=8的关系吧。但是这样好像不好找啊,有点乱,把合并成的2放到右边,似乎不对。例如第二到第三行的变化是不符合枚举规律的。那尝试一下不急着合并呢,不合并的话,为了满足枚举规律,只能将两个1放在最左边了。并且在枚举过程中,越靠近左边的元素是越靠后被合并的。也就是说加不加这个1上去,从开始一直合并到图二那个状态的过程是一样的,可以看到每一步都是符合枚举规律的,也就是说可以继续合并下去! 
 
这就得到了n=8的枚举!关键是,它是从n=7的状态,通过改变条件(加1),得到的。所以,可以大胆假设当n是偶数的时候S(n)=S(n-1)+f(n)。f(n)就是下面的那个三角形。 
下面考虑下面那个三角形。它的行数一定跟n有关系吗?大胆假设有,所以行数参数是n。当然,单独研究它的话,要想到把问题简单化。都除以2试一试。 
 
很容易发现,这是n=4的枚举。 
因此,S(n)=S(n-1)+S(n/2)。

最后检验,正确。

 #include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#define mod 1000000000
using namespace std;
long long dp[];
int main()
{
long long n;
cin >> n;
long long i;
memset(dp, , sizeof(dp));
dp[] = ;
for (i = ; i <= n; i++)
{
if (i * == ) dp[i] = dp[i - ]%mod;
else dp[i] = (dp[i - ] + dp[i / ])%mod;
}
cout << dp[n] << endl;
return ;
}

poj 2229 Sumsets(dp)的更多相关文章

  1. poj -2229 Sumsets (dp)

    http://poj.org/problem?id=2229 题意很简单就是给你一个数n,然后选2的整数幂之和去组成这个数.问你不同方案数之和是多少? n很大,所以输出后9位即可. dp[i] 表示组 ...

  2. poj 2229 Sumsets(dp 或 数学)

    Description Farmer John commanded his cows to search . Here are the possible sets of numbers that su ...

  3. POJ 2229 Sumsets(规律)

    这是一道意想不到的规律题............或许是我比较菜,找不到把. Description Farmer John commanded his cows to search for diffe ...

  4. POJ 2229 Sumsets(递推,找规律)

    构造,递推,因为划分是合并的逆过程,考虑怎么合并. 先把N展开成全部为N个1然后合并,因为和顺序无关,所以只和出现次数有关情况有点多并且为了避免重复,分类,C[i]表示序列中最大的数为2^i时的方案数 ...

  5. POJ 2229 Sumsets(找规律,预处理)

    题目 参考了别人找的规律再理解 /* 8=1+1+1+1+1+1+1+1+1 1 8=1+1+1+1+1+1+1+2 2 3 8=1+1+1+1+2+2 8=1+1+1+1+4 4 5 8=1+1+2 ...

  6. POJ 3034 Whac-a-Mole(DP)

    题目链接 题意 : 在一个二维直角坐标系中,有n×n个洞,每个洞的坐标为(x,y), 0 ≤ x, y < n,给你一把锤子可以打到地鼠,最开始的时候,你可以把锤子放在任何地方,如果你上一秒在( ...

  7. POJ 2229 Sumsets【DP】

    题意:把n拆分为2的幂相加的形式,问有多少种拆分方法. 分析:dp,任何dp一定要注意各个状态来源不能有重复情况.根据奇偶分两种情况,如果n是奇数则与n-1的情况相同.如果n是偶数则还可以分为两种情况 ...

  8. poj 3230 Travel(dp)

    Description One traveler travels among cities. He has to pay for this while he can get some incomes. ...

  9. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

随机推荐

  1. MyEclipse关联SVN下载项目到本地

    目的:在MyEclipse上关联SVN,从SVN服务器上,下载项目,到本机的MyEclipse上,并运行 准备工作 1.安装好Tomcat和MyEclipse 2.安装好Plsql,并配置连接好Ora ...

  2. reboot 后 Docker服务及容器自动启动设置

    https://blog.csdn.net/wxb880114/article/details/82904765 重启reboot操作系统后,发现docker 服务未启动,容器也未启动,天生反骨,怎么 ...

  3. node 常见的一些系统问题

    nodde正风生火起,很多介绍却停留在入门阶段,无法投入生产 许多文章在讲第三方类库,可是这些库质量差距较大,一旦遇到问题怎么办 全面了解node核心才能成为一名合格的node开发人员 1. node ...

  4. ubuntu下的烧录工具

    Flash Image Tool1.0 为了ubuntu下能够方便地烧录版本,我开发了Flash Image Tool.现在服务器(192.167.100.225)上有一份它的拷贝share/Tool ...

  5. mysql-5.6.17-win32安装

    下载免安装压缩文件http://dev.mysql.com/downloads/mysql/ 解压到自定义目录,我这里演示的是D:\wamp\mysql\   复制根目录下的my-default.in ...

  6. webstrom vue配置eslint

    (得出结论,还是得从官方文档中找,哇!!) 1.安装eslint插件,可以从search in repositories中获得,或者:http://plugins.jetbrains.com/plug ...

  7. (树莓派、Arduino、物联网、智能家居、机器人)传感器、机械装置、电子元件

    定制 PCB 1. 机械类 履带底盘 2. 传感器 温度传感器(temperature).湿度传感器(humidity) DHT11/DHT22 驱动:BCM2835 (被动)红外传感器(Passiv ...

  8. Redis的持久化策略

    Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...

  9. 将整个文件夹推上github

    /*游戏或者运动才能让我短暂的忘记心痛,现如今感觉学习比游戏和运动还重要——曾少锋*/ 首先你要有一个本地仓库和一个远程仓库(github中的仓库).git文件夹下面不能含有 git文件夹,如果有的话 ...

  10. POJ 1142:Smith Numbers(分解质因数)

                                   Smith Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submiss ...