1. 程式人生 > >動態規劃之切割繩子

動態規劃之切割繩子

/*
    切割繩子,每段繩子都有一個最大值,給定長度為n的繩子,如何切割讓利益最大化
    自底而上的方法,對於任何子問題,直至它依賴的所有子問題都解決,才會去解決它。
*/
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> max_value(100,0);//當長度為n時,最大利益
vector<int> first_cut(100,0);//當長度為n時,切割一刀的位置
vector<int> price{0,1
,5,8,9,10,17,17,20,24,30};//每段繩子的價值 void cut_rope(int n) { int max; max_value[0] = 0;//長度為0,值為0; for(int j = 1;j <= n;j++)//總長度 { max = -1; for(int i = 1;i <= j;i++)//第一刀的長度 { if(max < price[i] + max_value[j-i])//切割長度為i時的價值加上剩餘長度的價值最大 { max = price[i] + max_value[j-i]; first_cut[j] = i;//長度為j時切第一刀的位置
} } max_value[j] = max;//長度為j的時候,最大值為 } } void print_cut_rope_solution(int n) { cut_rope(n); cout <<"最大值為:"<<max_value[n]<<endl; cout <<"切割方案為:"; while(n > 0) { cout << first_cut[n]<<" "; n = n-first_cut[n]; } } int
main() { cout <<"請輸入繩子長度:"; int n; cin >>n; print_cut_rope_solution(n); return 0; }

每個子問題說白了就是上一次求解的所有子問題的和

這裡寫圖片描述
這裡寫圖片描述