時間限制: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;
}