以为黄题又要耽误我一个小时(结果看了眼样例暴力dfs过了)
题目传送门:[NOIP2001 提高组] 数的划分 - 洛谷
分析题目
观察题目,发现每种分法的后一项一定比前面哪一项大于或者等于
把7分成三份,每份不能为0
分第一份:
当前能够分的有7
因为后面两份不能为0,所以最多到 7- ( 3 - 1) = 5
分到后面每一份也是一样的
上代码
#include<iostream>
using namespace std;
int n,k,ans;
int shuzu[201];//存储答案
void dfs(int num,int shengyu){//num表示分到第几份,剩余多少能分
if(num==k+1){
//分到第k+1份结束
if(shengyu==0){
//只有刚好分完才算
ans++;
}
return;//记得返回
}
for(int i= shuzu[num-1]==0 ?1 : shuzu[num-1] ; i<=shengyu-(k-num) ;i++ ){
//因为每一项都比前一项大或者相等,但num=1时前一项是0,因此偷懒用了双目运算符特判(
//i<=shengyu-(k-num) 考虑到不能为0,所以给后面的位数都至少留1
shuzu[num] = i;//存答案
dfs(num+1,shengyu-i);//下一项,剩余减
}
}
int main(){
cin>>n>>k;
dfs(1,n);//一开始剩余n
cout<<ans;
return 0;
}