POJ2229--Sumsets
2015-08-24 21:30
405 查看
题目大意:把一个整数分解为2的幂的和共有几种方案
分析:以6和7为例,
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+2+2
6 = 1+1+4
6 = 2+2+2
6 = 2+4
7 = 1+1+1+1+1+1+1
7 = 1+1+1+1+1+2
7 = 1+1+1+2+2
7 = 1+1+1+4
7 = 1+2+2+2
7 = 1+ 2+4
如果i为奇数的话,表达式里肯定有1,相当于dp[i-1]的所有情况加1,所以dp[i] = dp[i-1]
如果i为偶数的话,表达式是里若有1,则至少有两个1,那么dp[i-2]的所有情况加两个1,就是dp[i]有1的情况。若没有1,则把表达式的项都除以2即可,也就是dp[i/2]了。所以,dp[i] = dp[i-2]+dp[i/2]。
最后别忘了对10^9取模
代码:
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1000000 + 10;
int dp[maxn];
int main() {
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= 1000000; i++) {
if(i%2) dp[i] = dp[i-1];
else dp[i] = dp[i-2] + dp[i/2];
dp[i] = dp[i]%1000000000;
}
int n;
scanf("%d", &n);
printf("%d\n", dp
);
return 0;
}
分析:以6和7为例,
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+2+2
6 = 1+1+4
6 = 2+2+2
6 = 2+4
7 = 1+1+1+1+1+1+1
7 = 1+1+1+1+1+2
7 = 1+1+1+2+2
7 = 1+1+1+4
7 = 1+2+2+2
7 = 1+ 2+4
如果i为奇数的话,表达式里肯定有1,相当于dp[i-1]的所有情况加1,所以dp[i] = dp[i-1]
如果i为偶数的话,表达式是里若有1,则至少有两个1,那么dp[i-2]的所有情况加两个1,就是dp[i]有1的情况。若没有1,则把表达式的项都除以2即可,也就是dp[i/2]了。所以,dp[i] = dp[i-2]+dp[i/2]。
最后别忘了对10^9取模
代码:
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1000000 + 10;
int dp[maxn];
int main() {
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= 1000000; i++) {
if(i%2) dp[i] = dp[i-1];
else dp[i] = dp[i-2] + dp[i/2];
dp[i] = dp[i]%1000000000;
}
int n;
scanf("%d", &n);
printf("%d\n", dp
);
return 0;
}
相关文章推荐
- 服务程序中侦测用户logon和logoff消息
- 4540 威威猫系列故事——打地鼠
- Linux 内核态与用户态
- POJ 1260 Pearls(DP)
- Android:外部存储的读写
- Cube Stacking
- IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic、@synthesize、@property、@dyna
- poj 2299 Ultra-QuickSort (归并排序模板)
- 中文字符ASCII码和NSString相互转换
- LeetCode:Ugly Number
- hdu 1040 As Easy As A+B
- 野人学Android基础篇之初探UI控件第一课--TextView动态赋值
- HDOJ 2588 GCD(欧拉函数)
- java枚举
- Ubuntu下添加开机启动项的2种方法
- 从错误中学python(5)——list的sort方法
- UVa 121 - Pipe Fitters
- leetcode: (202) Happy Number
- Android UI(ImageView CheckBox)、ListView和Adapter
- 博主的缺点