poj 2220 Sumsets

Sumsets

Time Limit: 2000MS   Memory Limit: 200000K
Total Submissions: 16876   Accepted: 6678

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
初学动态规划,我用了一种非常愚蠢的解法耗内存又超时了...AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
int dp[1000000+1];
/*const int N_MAX = 1000000;
int dp[21][N_MAX + 1];
int main() {
    int N;
    while (cin >> N) {
        int k = 0;
      while ((1 << k) <= N) {//求使得2^k大于N的最小k
        k++;
     }

      for (int i = 0;i < k;i++)
          dp[i][0] = 0;
      for (int i = 1;i <= N;i++)
          dp[0][i] = 1;
      for (int i = 1;i < k;i++) {
          for (int j = 1;j <= N;j++) {
              dp[i][j] = dp[i - 1][j];
              for (int k1 = 1;(j - k1*(1 << i))>=0;k1++) {
                  dp[i][j] += dp[i - 1][j - k1*(1 << i)];
              }
          }
      }
      cout << dp[k-1][N] << endl;
    }
    return 0;
}*/
//若i为奇数,(i-1)为偶数,i的组合数就是(i-1)的组合数,因为(i-1)只能加1得到i。若i为偶数,(i-1)为奇数,则通过(i-1)+1的方式得到i的组合必定带有1,接下来考虑
//全是偶数的组合数,考虑到全是偶数的组合数和(i/2)的组合数一样,因为只要(i/2)的组合数里每一个数*2就可以得到i
int main() {
    int N;
    while (cin >> N) {
        dp[1] = 1;
        for (int i = 2;i <= N;i++) {
            if ((i & 1)==0) {//若为偶数
                dp[i] = dp[i / 2];
            }
            dp[i] += dp[i - 1];
            dp[i] %= 1000000000;
        }
        cout << dp[N] << endl;
    }
    return 0;
}
				
时间: 2024-10-07 22:35:25

poj 2220 Sumsets的相关文章

poj 2459 Sumsets

Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11612   Accepted: 3189 Description Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S. Input Several S, each cons

POJ 2549 Sumsets

Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10593   Accepted: 2890 Description Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S. Input Several S, each cons

poj 2229 Sumsets 完全背包求方案总数

Sumsets 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)

POJ 2229 Sumsets (递推&amp;整数划分变形)

http://poj.org/problem?id=2229 思路:假设加数按从小到大的顺序.当n为奇数时,第一个数必须为1,此时f(n)=f(n-1):当n为偶数时,分两种情况讨论,若第一个数为1,则f(n)=f(n-1),若第一个数不为奇数,则所有数都不为奇数,提出一个公因子2出来,就是f(n/2),所以,f(n)=f(n-1)+f(n/2) 完整代码: /*63ms,4300KB*/ #include<cstdio> const int mod = 1e9; const int maxn

POJ 2229 Sumsets(找规律,预处理)

题目 参考了别人找的规律再理解 /* 8=1+1+1+1+1+1+1+1+1 1 8=1+1+1+1+1+1+1+2 2 3 8=1+1+1+1+2+2 8=1+1+1+1+4 4 5 8=1+1+2+2+2 8=1+1+2+4 6 7 8=2+2+2+2 8=2+2+4 8=4+4 8=8 8~9 */ /* 以下引用自博客:http://blog.csdn.net/scorpiocj/article/details/5940456 如果i为奇数,肯定有一个1,把f[i-1]的每一种情况加一个

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

POJ 2229 Sumsets(递推,思考)

/* n = 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 */ /* 若i为偶数 : 若有 1 ,至少有两个 ---->f[i-2]的情况+两个1, 若没有1 , 将偶数分解/2-----> f[i/2]; 则dp[i] = dp[i / 2] + dp[i-2] 若i为奇数: 必定有 1, dp[i] = 减去1的序列,加上1 则dp[i] = dp[i – 1] */ 1 #in

poj 2229 Sumsets

题目大意: 一个数由2的幂次数的和构成,问有几种构成方式? 主要是找规律 代码如下 1 #include <cstdio> 2 #include <cstring> 3 int n; 4 #define M 1000000000 5 int dp[1000002]; 6 7 int main(int argc, char const *argv[]) 8 { 9 dp[1] = 1; 10 dp[2] = 2; 11 for(int i = 3; i <= 1000000;

poj 2229 Sumsets(dp 或 数学)

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+