poj 2229 (动态规划,找规律)

题意:求把一个整数分解为2的幂的和共有几种方案

f(1)                      (1)

f(2)                   (1 1)                 (2)

f(3)                            (1 1 1)              (1 2)

f(4)              (1 1 1 1)           (1 1 2)           (2 2)           (4)

f(5)           (1 1 1 1 1)        (1 1 1 2)        (1 2 2)        (1 4)

f(6)        (1 1 1 1 1 1)     (1 1 1 1 2)     (1 1 2 2)     (1 1 4)    (2 2 2)     (2 4)

f(7)        (1 1 1 1 1 1 1)  (1 1 1 1 1 2)  (1 1 1 2 2)  (1 1 1 4)  (1 2 2 2)  (1 2 4)

。。。

发现规律了吗?

如果n是奇数那么f(n)=f(n-1)   在f(n-1)的组合前面加上1就可以了               

如果n是偶数那么f(n)=f(n-1)+f(n/2),因为f(n)比f(n-1)多出的数字组合正好是f(n/2)的组合中每一位都乘以2得到的

#include<stdio.h>
int main(void)
{
       int f[1000001],i,N;
       f[1]=1;
       f[2]=2;
       for(i=3;i<=1000000;i++)
       {
                if(i&1)  //判断奇偶
                        f[i]=f[i-1];
                else
                {
                        f[i]=f[i-1]+f[i>>1];//i>>1位运算就是i/2
                        f[i]%=1000000000;
                }
      }
           scanf("%d",&N);
           printf("%d\n",f[N]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值