【動態規劃】整數拆分

時間限制:1秒 空間限制:65536K 熱度指數:8566

 算法知識視頻講解

校招時部分企業筆試將禁止編程題跳出頁面,爲提前適應,練習時請使用在線自測,而非本地IDE。

題目描述

一個整數總可以拆分爲2的冪的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 總共有六種不同的拆分方式。 再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。 用f(n)表示n的不同拆分的種數,例如f(7)=6. 要求編寫程序,讀入n(不超過1000000),輸出f(n)%1000000000。

輸入描述:

每組輸入包括一個整數:N(1<=N<=1000000)。

輸出描述:

對於每組數據,輸出f(n)%1000000000。

示例1

輸入

7

輸出

6

1. 用二維數組dp會超出內存限制

2. 可以轉化爲揹包問題,21種物品,每一個可以重複取,問能恰好達道固定重要重量的選取的方案數。

dp[i][j] 表示在前i個物品中恰好選到重量爲j的方案數,那麼則有:

dp[i][j] = dp[i-1][j](不選第i個物品)+dp[i][j-a[j]](至少選一個第i個物品)

可以在循環中簡化爲:

dp[j] += dp[j-a[i]]

#include<bits/stdc++.h>
using namespace std;
int dp[1000005];
int main(){
    int a[25];
    for(int i = 0; i <= 20; i++)
        a[i] = 1 << i;
    int n;
    dp[0] = 1;
    for(int i = 0; i <= 20; i++){
        for(int j = a[i]; j <= 1000000; j++){
            dp[j] += dp[j-a[i]];
            dp[j] %= 1000000000;
        }
    }
    while(scanf("%d", &n) != EOF){
        cout << dp[n] << endl;
    }

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章