|
7#
楼主 |
发表于 2020-3-14 20:50:29
|
只看该作者
第一个优化,前面k-1个已经枚举出来了的话,最后一个不用枚举,只需要n-前面k-1个的和就是,加上这个优化。
第二个优化,第1个数一定不能取到n/k+1,第2个数一定不能取到n/(k-1)+1,****为什么:因为第2个数大于等于第1个,第三个大于等于第2个,要是a1>n/k+1,那么a2>n/k+1,** ak>n/k+1,全部加起来就>n了。
- /// 1025
- #include <iostream>
- using namespace std;
- const int mn=210;
- const int mk=7;
- int a[mk],n,k,ans=0;
- void pr()
- {
- int i,s=0;
- for (i=1; i<=k-1; i++) s+=a[i]; ///前面k-1个的和
- a[k]=n-s;
- if (a[k]>=a[k-1])
- {
- cout<<++ans<<':';
- for (i=1; i<=k; i++) cout<<a[i]<<' ';
- cout<<endl;
- }
- }
- void dfs(int i)
- {
- if (i>k-1) pr();
- else for (int j=a[i-1]; j<=n/(k-i+1)+1; j++) ///k被前面用了
- {
- a[i]=j;
- dfs(i+1);
- }
- }
- int main()
- {
- n=20,k=4; ///20 分成4 组
- a[0]=1;
- dfs(1);
- return 0;
- }
复制代码
这些优化的方法是考试的重点,平常一般考搜索的话,大家都会动笔,但是谁做得好呢?差别就在优化。 |
|