動態規劃之切割繩子
阿新 • • 發佈:2019-01-08
/*
切割繩子,每段繩子都有一個最大值,給定長度為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;
}
每個子問題說白了就是上一次求解的所有子問題的和