地址:http://acm.bit.edu.cn/mod/programming/view.php?a=525
将一个给定分数划分成许多单位分数之和,限制这些单位分数分母之积不能超过a,个数不能超过n,求方法总数。
给了那么多贴心限制肯定是DFS啦,注意假设所选分数分母非递减,防止重复。
自己写的0.14s。。那些0.008估计是利用了什么性质优化了?
#include<iostream>
using namespace std;
typedef struct FENSHU
{
int zi,mu;
}fenshu;
fenshu init;
inline fenshu operator - (fenshu a,fenshu b) //改成内联函数 0.236s --> 0.14s
{
fenshu ans;
ans.zi=a.zi*b.mu-a.mu*b.zi,ans.mu=a.mu*b.mu;
return ans;
}
int ans;
int a,n;
void dfs(fenshu now,int num,int pro,int last) //now当前还剩的分数值,num当前最多还能分几个,pro已选分母乘积,last 上一个选的分母
{
fenshu next,temp;
temp.zi=num,temp.mu=last;
temp=now-temp;
if(temp.zi>0) return; //若剩下全取最大也不够了 0.396s --> 0.236s
if(now.zi==0)
{
ans++;
return;
}
if(num==0) return;
for(int i=a/pro;i>=last;i--)
{
temp.zi=1,temp.mu=i; //所选单位分数
next=now-temp;
if(next.zi<0) break;
dfs(next,num-1,pro*i,i);
}
}
int main()
{
while(scanf("%d%d%d%d",&init.zi,&init.mu,&a,&n),init.zi&&init.mu&&a&&n)
{
ans=0;
dfs(init,n,1,0);
printf("%d\n",ans);
}
return 0;
}