[csharp]
//dp(完全背包)
#include <stdio.h>
#include <string.h>
#define N 35000
int dp[N];
int main()
{
dp[0] = 1;
for(int i = 1; i <= 3; ++i)
{ //背包容量為N,裝入質量為i 的物品
for(int j = i; j < N; ++j)
{
dp[j] += dp[j-i];
}
}
int n;
while(scanf("%d", &n) != EOF)
printf("%d\n", dp[n]);
return 0;
}<pre name="code" class="csharp">//hdu 1284 找規律
//給出n 看能n 內有多少個 2 和多少個3
//具體看代碼和一下注視
#include<stdio.h>
#include <string.h>
#define N 35000
__int64 ans[N];
int main()
{
int n; // 計算i 可以由多少個 2 組成
for(int i = 0; i < N; ++i)
// 後面的 +1 表示全由1組成的(只有1中情況)
ans[i] = i / 2 + 1;
//則這一行表示由 2組成的情況加上由1組成的情況
// 從前面往後推,看能由幾個3 組成,比如 ans[3]表示錢為3時
// 由1,2分硬幣組成的情況,可以表示成錢為0 時加上一個3分硬幣(這時方法數為
// 錢為 0 時由1,2,3組成的情況 加上錢為3時由1,2組成的方法數)
// 因此 ans[i] += ans[i-3]+1;不需要後面的+1
for(int i = 3; i < N; ++i) ans[i] += ans[i-3];
//這一行ans[i]就表示由2組成的情況加上由3組成的情況
// ans[6]就相當於由2組成的情況ans[6] 加上 由1,2,3組成的情況的ans[6-3]
// 這樣往後推,就可以把 由3分組成的情況加上去
while(scanf("%d", &n) != EOF)
printf("%I64d\n", ans[n]);
return 0;
}</pre><br>
<pre></pre>
<p></p>
<pre></pre>
<br>
<p></p>