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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

羊群过河问题

發布時間:2025/4/9 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 羊群过河问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  一位牧民和一群數量為n的羊群,前方遇到一條小河,河邊剛好有一條小船,假設小船足夠大,可以一次載完所有羊,但是牧民會很累,船會劃得很慢,但可以分批運過去:

  如果載一只羊過河,需要M(1)分鐘 ;

  如果載兩只羊過河,需要M(2)分鐘 ;

  如果載三只羊過河,需要M(3)分鐘 ;

  …………

  牧民空船返回對岸需要M分鐘 ;

求得最短時間將所有的羊運到河對岸。

很像一道智力題,但在計算機看來,兩步就可以得到答案。

下面給出我的思維過程:

  dp[n]? 表示? 把n只羊運送到河對岸需要的最少時間? ;

  如果只有一只羊需要過河 ,需要的時間 ,用 M + M(1) 來表示 ; 把 M + M(1) 的值賦給 dp[1] ;  

  如果有兩只羊需要過河,先算出把兩只羊一塊載過去需要多長時間 ,用M + M(1) + M(2)來表示 ;

然后再算,先載一只過去,再把另外一只載過去需要多長時間,用dp[1] + dp[1] + m 來表示 ;

比較一下兩種方法,哪種時間用的最少,把最少的賦值給dp[2] ;

  如果有三只羊需要過河,先算出把三只羊一塊載過去需要多長時間,用M + M(1) + M(2) + M(3) 來表示 ;

然后再算,先載一只過去,再把另外兩只載過去需要多長時間,用dp[1] + m + dp[2] 來表示 ;

然后再算,先載兩只過去,再把另外一只載過去需要多長時間,用dp[2] + m + dp[1] 來表示 ;

比較一下三種方法,哪種時間用的最少,把最少的賦值給dp[3] ;

  …………     ;

  這樣分析之后,很容易聯想到用動態規劃解題。(求全局最優解)

下面給出相關代碼:

#include<iostream> using namespace std ; int main() {int n ; cin >> n ;while(n--) {int N , m ;cin >> N >> m ;int dp[1100] , i ;dp[0] = m ;for(i = 1 ; i <= N ; i++) {int t ;cin >> t ;dp[i] = dp[i-1] + t ;}for(i = 2 ; i <= N ; i++) for(int j = 1 ; j < i ; j++)if(dp[i] > ( dp[j] + dp[i - j] + m))dp[i] = dp[j] + dp[i-j] + m ;cout << dp[N] << endl ;}return 0 ; }

?

  

轉載于:https://www.cnblogs.com/scottding/p/3611342.html

總結

以上是生活随笔為你收集整理的羊群过河问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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