noip2001 数的划分
刚开始写的程序,只能过4个点,最后一个剪枝想不到,看了题解才想到
还有一个重点:如果保证不重复呢,就是保证递增就行
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; const int maxn=202; int n,k,ans,flag,cnt,a[maxn]; //只有一个策略,保证所有的数目都是递增的即可 一个简单的剪枝 void dfs(int res,int x) { if(x==1&&res<a[cnt]) return;//保证所有都是递增的 if(x==1){ans++;return;} for(int i=1;i<=res/x;i++)//重要的减枝在这里 { if(i>=a[cnt]) { cnt=cnt+1; a[cnt]=i; dfs(res-i,x-1); cnt=cnt-1; } } } int main() { scanf("%d%d",&n,&k); dfs(n,k); printf("%d",ans); }