洛谷 P1025 數的劃分

2022-06-03 10:30:18 字數 1292 閱讀 9229

本題有兩種解法 dfs和dp

dfs

sums+i*(k-t)<=n

其實這個也是很容易理解的 因為我們為了避免重複 將迴圈從小到大進行 那麼如果sums+i*(k-t)>n,說明後面的數肯定不滿足條件

#includeusing

namespace

std;

intn,k,anss,sums;

void dfs(int now,int

t)

for(int i=now;sums+i*(k-t)<=n;i++)

}int

main()

也可以把sums當作引數傳進去:

#includeusing

namespace

std;

intn,k,anss;

void dfs(int now,int t,int

sums)

for(int i=now;sums+i*(k-t)<=n;i++)

dfs(i,t+1,sums+i);

}int

main()

dp這個不是很好想 我是抄的題解:

f[i][x] 表示 i 分成 x 個非空的數的方案數。

顯然 i其餘的狀態,我們分情況討論:

①有1的 ②沒有1的

第一種情況,方案數為 f[i-1][x-1]

第二種情況,方案數為 f[i-x][x] (此時 i 必須大於 x)

所以,狀態轉移方程為: f[i][x]=f[i-1][x-1]+f[i-x][x]

解釋一下:

乙個數字i被分成k份時,存在兩種情況,乙個是有一存在,如6分成三份的1 2 3;另一種是沒有一存在,比如6分成三份的2 2 2;

如果有1存在,還是用6分三份舉例,那麼就是對5進行分兩份的操作,再加上那個1;如果沒有1存在,我們先將6變成(1+a)+(1+b)+(1+c);那麼a+b+c=6-3=3;然後他們需要被分配到三個位置上從而防止1的出現——即【i-k】【k】

#includeusing

namespace

std;

long

long

int n,k,a[205][10

],i,j;

intmain()

for(i=2;i<=k;i++)

for(i=2;i<=n;i++)

for(j=2;j<=k;j++)

cout

<}

洛谷 P1025 數的劃分

題目描述 將整數n分成k份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入輸出格式 輸入格式 n,k 6 n 200,2 k 6 輸出格式 乙個整數,即不同的分法。輸入輸出樣例 輸入樣例...

洛谷P1025 數的劃分

將整數n分成k份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入格式 n,k 6 輸出格式 乙個整數,即不同的分法。輸入樣例 1 7 3 輸出樣例 1 4 四種分法為 1,1,5 1,2...

洛谷P1025 數的劃分

將整數n分成k份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入格式 n,k 6 輸出格式 乙個整數,即不同的分法。輸入樣例 1 複製7 3 輸出樣例 1 複製4 四種分法為 1,1,5...