乙個整數總可以拆分為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如果i是奇數,i=1+(i-1),所以f(i)=f(i-1)
如果i是偶數,f(i)=f(i-1)+f(i/2) 此時i的所有劃分中有兩種情況,一種是包含1,一種是不包含1(我在這裡看別人的思路就不太懂,
不包含1:i=2*(i/2):對於i/2的每個劃分,對劃分中的每個數乘2,這樣整個劃分中就不會有1了。
舉個例子,6的不包含1的劃分:
#includeusing namespace std;
long long f[1000005];
int main()
printf("%lld\n",f[n]);
} return 0;
}
本題是要將乙個整數拆分為2的冪的和,即將n拆分成2^0,2^1,2^2,2^3……2^19,然後正好組成數n。可以理解為:乙個揹包容量為n,有20種物品,每種物品個數不限,體積分別為2^0,2^1,2^2,2^3……2^19,求有多少種方案能恰好把揹包裝滿,即完全揹包問題
int a[20]=;
狀態轉移方程:
dp[i][j]表示用前j個數字,組成i的方案個數,此時就分為兩種情況
此時不再是求哪種方案價值最大,而是總的方案個數,所以不用max,而是相加
dp[i][j]=dp[i][j-1]+dp[i-a[j]][j]
轉換為一維陣列 dp[i]=dp[i]+dp[i-a[j]] (j要從前往後遍歷)
邊界:
dp[0]=1
dp[1~n]=0
#includeusing namespace std;
long long dp[1000005];
int main()
int n;
while(scanf("%d",&n)!=eof)
dp[0]=1;
for(int j=0;j<20;j++)
} printf("%lld\n",dp[n]);
} return 0;
}
清華大學考研複試機試 abc
設a b c均是0到9之間的數字,abc bcc是兩個三位數,且有 abc bcc 532。求滿足條件的所有a b c的值。題目沒有任何輸入。請輸出所有滿足題目條件的a b c的值。a b c之間用空格隔開。每個輸出佔一行。水題,直接遍歷暴力求解即可,三層for迴圈。不過也有一些優化的點,可能優化效...
清華大學考研複試機試 root N,k
n 2000000000 每組測試資料報括一行,x 0輸入可能有多組資料,對於每一組資料,root x y,k 的值 4 4 104這道題乍一看好像沒有什麼思路,那就先暴力求解試試。不過不管你用pow函式,還是用快速冪運算,都過不了,因為結果已經爆long long int。有關快速冪運算這裡簡單提...
清華大學考研複試機試 進製轉換
將乙個長度最多為30位數字的十進位製非負整數轉換為二進位制數輸出。多組資料,每行為乙個長度不超過30位的十進位製非負整數。注意是10進製數字的個數可能有30個,而非30bits的整數 每行輸出對應的二進位制數。此題為大數轉換問題,通過模擬手工計算過程來實現。清華大學的考研複試機試經常為考察大整數問題...