POJ 2229 Sumsets(简单DP)
Posted Farewell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2229 Sumsets(简单DP)相关的知识,希望对你有一定的参考价值。
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).
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
题意:
一个数N能被拆分成多少种只由2的n次方相加的组合。
题解:
刚开始怎么也推不出来,╮(╯▽╰)╭自己还是好菜啊。。看了别人的题解后发现其实很容易。?
当i为奇数时,dp[i]=dp[i-1];当i为偶数时,dp[i]=dp[i-1]+dp[i/2]。
i为奇数,dp[i]等于前一个偶数的组合+1。偶数时,等于前一个数+1的组合数,加上dp[i/2]的组合数(可以看成提个公因子2)。
#include<iostream> using namespace std; const int maxn=1e6+5,mod=1e9; int dp[maxn]; int main() { int n; cin>>n; dp[1]=1,dp[2]=2; for(int i=3;i<=n;i++) dp[i]=(i&1)?dp[i-1]:(dp[i-2]+dp[i>>1])%mod; cout<<dp[n]<<endl; }
以上是关于POJ 2229 Sumsets(简单DP)的主要内容,如果未能解决你的问题,请参考以下文章