原
2023年12月09日 12:10:27
oneplus123
時間限制: 1 sec 記憶體限制: 128 mb
題目描述
美羊羊給喜羊羊和沸羊羊出了一道難題,說誰能先做出來,我就獎勵給他我自己做的一樣禮物。沸羊羊這下可樂了,於是馬上答應立刻做出來,喜羊羊見狀,當然也不甘示弱,向沸羊羊發起了挑戰。
可是這道題目有一些難度,喜羊羊做了一會兒,見沸羊羊也十分頭疼,於是就來請教你。
題目是這樣的:
把自然數n(n<=100)分解為若干個自然數之和,求出有幾種情況。
如n=5時,有7種情況
5=1+1+1+1+1
5=1+1+1+2
5=1+1+3
5=1+2+2
5=1+4
5=2+3
5=5怎麼樣?你要加油幫助喜羊羊哦!
輸入乙個自然數n(n<=100)
輸出無序拆分的種數。
複製樣例資料
5樣例輸出
71.遞迴,超級慢
2.dp
/**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef
long
long ll;
using
namespace
std;
int n;
intdp(int x, int y)
這一種
return
1;
}else
if(x == y)一種,第二種就是分比y小的數
return
1 + dp(x, x -
1);}
else
if(x < y)
else
if(x > y)
}int
main
()
/**/
3.母函式
/**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef
long
long ll;
using
namespace
std;
int n;
int dp[
105][
105];
intmain
()
}printf(
"%d\n", dp[n][n]);
return
0;
}/**/
f(x)=(1+x^1+x^2+x^3....+x^n)*(1+x^2+x^4+...)*.....(1+x^n);
上面的就是母函式。。。應該就是這樣
然後首先數為n的被分數,可以由1,2,3,4,......,n組成,就是不知道選1幾個,選2幾個。。。
這時候我們可以看一下母函式,設選的數字為i,選的次數為k,那麼x的指數可以表示為x^(i*k);
就像f(x)中(1+x^1+x^2+x^3....+x^n)表示1不選,1選一次,1選2次....; (1+x^2+x^4+...)表示2不選,2選1次,選2次。。。
那麼我們要求的分解n的種數就是x^n前的係數(很容易想)。
怎麼求x^n的係數呢,多項式相乘解決。
/**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef
long
long ll;
using
namespace
std;
int n;
int num1[
105], num2[
105];
intmain
()
}memcpy(num1, num2,
sizeof(num2));
memset(num2,
0, sizeof(num2));
}printf(
"%d\n", num1[n]);
return
0;
}/**/
自然數無序拆分
includeusing namespace std int n int dfs int x,int y int main includeusing namespace std int n,i,j,f 105 105 int main else if i j else if i j3.母函式 f x...
自然數拆分
描述 description 輸入自然數n,然後將其拆分成由若干數相加的形式,參與加法運算的數可以重複。輸入格式 inputformat 輸入只有乙個整數n,表示待拆分的自然數n。n 80 輸出格式 outputformat 輸出乙個數,即所有方案數 樣例輸入 sampleinput 複製資料 7 ...
自然數拆分
問題描述 自然數的拆分 任何乙個大於1的自然數n,總可以拆分成若干個自然數之和,並且有多種拆分方法。試求 n的所有拆分。例如自然數5,可以有如下一些拆分方法 5 1 1 1 1 1 5 1 1 1 2 5 1 2 2 5 1 4 5 2 3 注意,本題中n拆分出來的數x的範圍是1 x整數劃分可以參考...