日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

埃及分数 (迭代加深入门)

發布時間:2024/3/24 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 埃及分数 (迭代加深入门) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description:
在古埃及,人們使用單位分數的和(形如1/a的, a是自然數)表示一切有理數。如:2/3=1/2+1/6,但不允許2/3=1/3+1/3,因為加數中有相同的。對于一個分數a/b,表示方法有很多種,但是哪種最好呢?首先,加數少的比加數多的好,其次,加數個數相同的,最小的分數越大越好。
如:19/45=1/3 + 1/12 + 1/180
19/45=1/3 + 1/15 + 1/45
19/45=1/3 + 1/18 + 1/30,
19/45=1/4 + 1/6 + 1/180
19/45=1/5 + 1/6 + 1/18.
最好的是最后一種,因為1/18比1/180,1/45,1/30,1/180都大。
給出a,b( 0 < a < b < 1000),編程計算最好的表達方式。
輸入:a b
輸出:一個等式

Sample Input:
3 4
Sample Output:
3/4 = 1/2 + 1/4

題解:
 這道題顯然我們既不能用DFS深搜(因為分數的個數不限),也不能用BFS廣搜(因為分母也是無限的),但由題意可知,我們要做到的是最少的分數個數,并且最大的分母盡量小,我們可以考慮一種新的搜索——迭代加深??梢哉J為它結合了DFS與BFS,在限定的層數內深搜
 
 于是這道題我們便找到了正確的搜索方法:先不斷遞增分數的個數,第一次找到的一定是個數最小的解,然后處理最優性問題,首先我們不能在找到一組解之后就直接return ,這樣只滿足了第一個目標,正確做法應該是返回上一層繼續遞歸。那么什么情況下才會break呢?我們假設當前還可以枚舉 d 個分數 , 當前剩余的分數是 a/b , 枚舉的分母為 i , 如果d/i<=a/b,我們就可以 break 掉了,這是因為如果后面都是 1/i 也只能小于等于目標,那么肯定不存在解了,因為分母必須嚴格遞增。

#include <bits/stdc++.h> #define N 100001 #define min(x,y) x > y ? y : x #define max(x,y) x > y ? x : y using namespace std; typedef long long LL; LL a,b,best,ans[N],flag,limt,way[N];void dfs(LL x , LL y , LL dep) {LL l1,l2,xx,yy,i,j;l1 = max(way[dep - 1] + 1 , y / x); //尋找當前層數分母的最小值l2 = min(y * (limt -dep + 1) / x , best - 1);//尋找當前層數分母的最大值for(i = l1 ; i <= l2 ; i ++){xx = x; yy = y; way[dep] = i; //xx = xx * i - yy; //計算剩余的分子if(x < 0) continue;yy = yy * i; //計算剩余的分母if(dep < limt) dfs(xx,yy,dep + 1);if(i < best && xx == 0){flag = 1 ; best = i;for(j = 1 ; j <= limt ; j ++)ans[j] = way[j]; //更新答案}} } int main() {//freopen("lx.in","r",stdin);cin >> a >> b;cout<<a<<"/"<<b<<" = ";flag = 0 ; way[0] = 1 ; best = 99999999;while(flag == 0){limt++; // 枚舉當前深搜的層數 dfs(a,b,1);}for(LL i = 1; i < limt ; i ++) cout <<"1/"<<ans[i]<<" + ";cout<<"1/"<<ans[limt]; }

總結

以上是生活随笔為你收集整理的埃及分数 (迭代加深入门)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。