zoukankan      html  css  js  c++  java
  • POJ_2229_Sumsets_(动态规划)

    描述


    http://poj.org/problem?id=2229

    将一个数n分解为2的幂之和共有几种分法?

    Sumsets
    Time Limit: 2000MS   Memory Limit: 200000K
    Total Submissions: 16207   Accepted: 6405

    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

    Source

    分析


    对i讨论:

    1.i是奇数:

      分成的序列中必有1,所以可将i分为1+(i-1),所以f[i]=f[i-1];

    2.i是偶数:
      (1).分成的序列中有1:

        同奇数,f[i]=f[i-1];

      (2).分成的序列中没有1:

        序列中的所有数都是2的倍数,那么任一种序列中的各个数/2,就得到了i/2的序列,那这种情况下,i的序列数就和i/2的序列数相同即f[i]=f[i/2];

      综上:f[i]=f[i-1]+f[i/2];

     1 #include<cstdio>
     2 
     3 const int maxn=1000005,mod=1e9;
     4 int n,f[maxn];
     5 
     6 int main()
     7 {
     8 #ifndef ONLINE_JUDGE
     9     freopen("sum.in","r",stdin);
    10     freopen("sum.out","w",stdout);
    11 #endif
    12     scanf("%d",&n);
    13     f[1]=1;
    14     for(int i=2;i<=n;i++)
    15     {
    16         if(i&1) f[i]=f[i-1];
    17         else f[i]=(f[i-1]+f[i/2])%mod;
    18     }
    19     printf("%d
    ",f[n]);
    20 #ifndef ONLINE_JUDGE
    21     fclose(stdin);
    22     fclose(stdout);
    23 #endif
    24     return 0;
    25 }
    View Code
  • 相关阅读:
    获取请求浏览器信息
    (转)获取页面 鼠标位置
    (转)location.href 用法
    (转)异常的处理
    (转载)提高ASP.NET Web应用性能的技巧
    赶集网二手数据.py
    豆瓣top250.py
    爬取58二手数据.py
    使用类和实例.py
    爬取小猪短租房.py文件
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5425178.html
Copyright © 2011-2022 走看看