1. 程式人生 > >NOI online judge 複雜的整數劃分問題(深搜)

NOI online judge 複雜的整數劃分問題(深搜)

題目:
描述
將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整數n 的這種表示稱為正整數n 的劃分。

輸入
標準的輸入包含若干組測試資料。每組測試資料是一行輸入資料,包括兩個整數N 和 K。
(0 < N <= 50, 0 < K <= N)
輸出
對於每組測試資料,輸出以下三行資料:
第一行: N劃分成K個正整數之和的劃分數目
第二行: N劃分成若干個不同正整數之和的劃分數目
第三行: N劃分成若干個奇正整數之和的劃分數目

要會找規律,測試了一些資料發現第二行和第三行的輸出是一樣的(並不會證
於是就可以在時限內過了(這題200ms,卡的很死,肯定有其他優化但我這個蒟蒻沒發現= =)

using namespace std;
int ans=0,cnt=0,sum=0,n,k;
void dfs1(int pre)
{
if(cnt==k)
{
if(sum==n) ans++;
return;
}
for(int i=pre;i*(k-cnt)<=(n-sum);i++)
{
cnt++;
sum+=i;
dfs1(i);
cnt–;
sum-=i;
}
return;
}
void dfs2(int pre)
{
if(sum==n)
{ ans++; return; }
if(sum>n) return;
for(int i=pre+1;i<=(n-sum);i++)
{
cnt++;
sum+=i;
dfs2(i);
cnt–;
sum-=i;
}
}
int main()
{
while(scanf(“%d%d”,&n,&k)!=EOF)
{ ans=0,cnt=0,sum=0;
dfs1(1);
printf(“%d\n”, ans);
ans=0,cnt=0,sum=0;
dfs2(0);
printf(“%d\n”, ans);
printf(“%d\n”, ans);
}
}