POJ 2229 Sumsets

题目链接

题意

给定一个数字,问用2的次方数凑,一共有几种情况
例如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
一共有6种情况

AC

  • 完全背包
int dp[N];  //long long超时。。。
int mod = 1e9;
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif
    int n;
    cin >> n;
    int a[22];
    for (int i = 0; i < 22; i++) {
        a[i] = 1 << i;
    }
    dp[0] = 1;
    for (int i = 0; i < 22; i++) {
        if (a[i] > n)   break;
        for (int j = a[i]; j <= n; ++j) {
            dp[j] += dp[j - a[i]];
            dp[j] %= mod;
        }
    }
    cout << dp[n] << endl;
    return 0;
}
  • 规律
    这里写图片描述
using namespace std;
int dp[N];
int mod = 1e9;
int main(){
#ifndef ONLINE_JUDGE
    // freopen("in.txt", "r", stdin);
#endif
    int n;
    cin >> n;
    dp[1] = 1;
    dp[2] = dp[3] = 2;
    for (int i = 4; i <= 1000000; ++i) {
        if (i > n)  break;
        if (i % 2) dp[i] = dp[i - 1] % mod;
        else    dp[i] = (dp[i - 2] % mod + dp[i / 2] % mod) % mod;
    }
    cout << dp[n] << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/henuyh/article/details/81088620