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. Django(五)在模板中使用静态文件

    location 最后一个文件夹名就是project名,我用了Django_Plan. Application 是自动加入的APP名字,我用了Plan 静态文件相关配置: Django_Plan\se ...

  2. struts2 正确配置通配符方式访问,报错解决

    今天遇到正确配置通配符访问action的方法,但是还是报错,原因struts 2.3 以后会内部会验证是否允许该方法,而我用的刚好是2.5的版本 要action配置中加上<allowed-met ...

  3. 读书笔记 C# Lookup<TKey,TElement>和ToLookup方法的浅析

    Lookup<TKey,TElement>类型对象和分组是一样的,就好比使用Linq的group关键字后所查询出来的结果,使用foreach的时候,都可以用IGrouping<TKe ...

  4. Motorola C118 PCB原理高清图

  5. css汇总

    1.居中 parentElement{ display:flex;/*Flex布局*/ display: -webkit-flex; /* Safari */ align-items:center;/ ...

  6. GitHub上最流行的Top 10 JavaScript项目

    统计出Github中所有项目的数量,几乎是不可能的,而明确指出哪些是最优秀的项目就更不可能了.如果说到JavaScript,曾经极富创新的项目(很可能)在一两个月后就会变得过时.落后.以防被淹没在大量 ...

  7. Ubuntu 搭建Ghost1.0博客系统

    最近想使用Ghost搭建自己的博客网站,网上搜索了下大多都是1.0之前版本搭建的文章,但是Ghost1.0版本已经可用好一段时间了,所以决定根据官方文档搭建Ghost1.0版本的博客系统. 下面开始一 ...

  8. WEB接口测试之Jmeter接口测试自动化 (一)

    软件测试自动化从不同的测试阶段分类,可从下层到上层依次分为单元测试-->接口测试-->界面自动化测试. 单元测试一般有开发人员自行完成,而界面自动化测试合适的测试条件又很难达到,测试人员在 ...

  9. spring读取propertyes 新方法

    <context:property-placeholder location="classpath:mysql.properties"/> <util:prope ...

  10. CentOS使用安装光盘建立本地软件源

    本实验的目的是使用CentOS的两张DVD安装光盘作为本地软件源,避免执行yum安装命令时每次都要从网络重新下载. 安装createrepo软件包 createrepo是制作软件源所需要的一个工具,默 ...