整數拆分 清華大學複試機試題 動態規劃

2021-10-24 10:18:34 字數 1444 閱讀 4302

乙個整數總可以拆分為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的整數 每行輸出對應的二進位制數。此題為大數轉換問題,通過模擬手工計算過程來實現。清華大學的考研複試機試經常為考察大整數問題...