本題有兩種解法 dfs和dp
dfs
sums+i*(k-t)<=n
其實這個也是很容易理解的 因為我們為了避免重複 將迴圈從小到大進行 那麼如果sums+i*(k-t)>n,說明後面的數肯定不滿足條件
#includeusingnamespace
std;
intn,k,anss,sums;
void dfs(int now,int
t)
for(int i=now;sums+i*(k-t)<=n;i++)
}int
main()
也可以把sums當作引數傳進去:
#includeusingnamespace
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】
#includeusingnamespace
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...