羊群过河问题
一位牧民和一群數(shù)量為n的羊群,前方遇到一條小河,河邊剛好有一條小船,假設(shè)小船足夠大,可以一次載完所有羊,但是牧民會很累,船會劃得很慢,但可以分批運過去:
如果載一只羊過河,需要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] ;
………… ;
這樣分析之后,很容易聯(lián)想到用動態(tài)規(guī)劃解題。(求全局最優(yōu)解)
下面給出相關(guān)代碼:
#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 ; }?
轉(zhuǎn)載于:https://www.cnblogs.com/scottding/p/3611342.html
總結(jié)
- 上一篇: IOS7 开发注意事项
- 下一篇: 数组求和(二)