當前位置:編程學習大全網 - 編程軟體 - c語言藍橋杯的壹道題 我百度了答案但是看不太懂,希望有人幫忙解釋壹下,只要註釋壹下dfs函數就好了!!

c語言藍橋杯的壹道題 我百度了答案但是看不太懂,希望有人幫忙解釋壹下,只要註釋壹下dfs函數就好了!!

void?dfs(int?cur,//?當前需要查找的分式

int?s,//?分母的最小值

long?long?fz,//?剩余未分配部分大小的分子

long?long?fm)//?剩余未分配部分大小的分母

{

//?如果需要查找最後壹個分式

if?(cur?==?n)

{

//?如果分母不能被分子整除,則最後壹個分式無法構成

if?(fm?%?fz)

return;//?從搜索中退回

//?最後壹個分式的分母

a[cur]?=?fm?/?fz;

//?如果最後壹個分式的分母大於30,從搜索中返回

if?(a[n]?>?30)

return;//?從搜索中退回

//?把所有的分式打印出來

for?(int?i?=?0;?i?<?n;?i++)

printf("1/%d?",?(int)a[i]);

printf("1/%d\n",?(int)a[n]);

return;//?從搜索中退回

}

//?計算下壹個分母的最小值

s?=?(int)max(s?*?1LL,?fm?/?fz?+?1);

int?i;

long?long?A,?B,?Gcd;

//?枚舉所有可能的下壹個分母

for?(i?=?s;;?i++)

{

//?假設後面所有的分式全部的分母都是?i,也不能夠使得總和達到?fz?/?fm

if?(i?*?fz?>=?fm?*?(n?-?cur?+?1))

break;//?不再枚舉更大的分母

//?設定當前分式的分母為?i

a[cur]?=?i;

//?剩余分數的分母

B?=?fm*i;

//?剩余分數的分子

A?=?fz*i?-?fm;

//?求最大公約數

Gcd?=?gcd(A,?B);

//?深搜,求下壹個分式,而且最小分母是?i?+?1,剩余分數的分子分母都約分

dfs(cur?+?1,?i?+?1,?A?/?Gcd,?B?/?Gcd);

}

return;

}

  • 上一篇:現在去技工學校學技術哪幾門技術好點?
  • 下一篇:編程公倍數
  • copyright 2024編程學習大全網