思路
代碼
#include <iostream>
using namespace std;
int n, k, ans = 0;
/*
*last:上一次循環(huán)到的值
*cur :當(dāng)前分的個數(shù)
*sum :當(dāng)前累計的總數(shù)
*/
void f(int last, int cur, int sum){
if(cur == k){ //如果分的個數(shù)和需要分的個數(shù)相同,就退出
if(n == sum){ //如果剛剛分完,就統(tǒng)計一次
ans++;
}
return;
}
//限制數(shù)范圍,防止后面分的數(shù)比前面的小,從而避免重復(fù)
for(int i = last; sum + i*(k-cur) <= n; i++){
f(i, cur+1, sum+i);
}
}
int main(){
cin >> n >> k;
f(1, 0, 0);
cout << ans;
return 0;
}
/*
*最開始想到的方法是dp,但是最開始找到的狀態(tài)轉(zhuǎn)移方程有問題,所以沒能AC,
*后面自己也想到了用多層for來搜索,搜索的次數(shù)用遞歸解決,但是循環(huán)條件
*沒有找好,導(dǎo)致分出來的數(shù)有重復(fù),沒有AC;看了dalao的方法,才知道了循環(huán)
*條件,最終AC。
*/
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。