POJ2229 Sumsets(DP)

69 篇文章 0 订阅

题意:

输入一个数n,要求分解为2的幂的和,求有几种组合方法

要点:

dp方程很难想到啊,先是考虑如果n为奇数,那么组合中肯定有1,那么f[n]=f[n-1];如果n为偶数的话,先考虑如果有1,那么肯定有两个1合并而来,如果没有1,则全为2,4,6这种,这样我们把分解式中所有数除2,最后得到f[n]=f[n-2]+f[n/2]。我自己想是想不出来了,还是挺巧妙的方法。注意题目要求输出保持在9位以内,所以最后%1e9。


15333232Seasonal2229Accepted4028K157MSC++392B2016-03-30 19:11:36
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 1000050
int f[maxn];

int main()
{
	int n;
	while (~scanf("%d", &n))
	{
		memset(f, 0, sizeof(f));
		f[1] = 1;		//组成1的只有1种,组成2的只有两种
		f[2] = 2;
		for (int i = 3; i < maxn; i++)
		{
			if (i % 2 == 1)
				f[i] = f[i - 1];//奇数与偶数相同,所以只要偶数取余即可
			else
			{
				f[i] = f[i - 2] + f[i / 2];
				f[i] = f[i] % 1000000000;	//最后取余
			}
		}
		printf("%d\n", f[n]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值