您的位置:首页 > 编程语言 > C语言/C++

c++ 动态规划(重构解).

2015-12-15 00:00 288 查看
摘要: 填坑.

#include <iostream>
#include <type_traits>

enum:int { MIMVALUE=-999 };
template<unsigned int N, typename T=int>
class DynamicPlan{
T (&Price)
; //随着长度的增加对应的总价格.
T Earnings
; //记录收益.
T OptimalSulation
; //记录最优解对应的第一段钢条的长度.

int length;//给定的钢条长度.

public:
DynamicPlan(T (&thePrice)
, const unsigned int& len);
~DynamicPlan();

void BottomToUp();
void print();
};

template<unsigned int N, typename T>
DynamicPlan<N, T>::DynamicPlan(T (&thePrice)
, const unsigned int& len)
:Price(thePrice),
length(len)
{
std::cout<<"the list of price:";
for(int i=0; i<N; ++i){
std::cout<<this->Price[i]<<"  ";
this->Earnings[i]=0; //获得随着切割次数的增加对应的价格.
this->OptimalSulation[i]=0; //最佳解决方案.
}
std::cout<<std::endl;
}

template<unsigned int N, typename T>
DynamicPlan<N, T>::~DynamicPlan()
{
std::cout<<"destroy it"<<std::endl;
}

template<unsigned int N, typename T>
void DynamicPlan<N,T>::BottomToUp()
{
this->Earnings[0]=0;

for(int j=1; j<length; ++j){ //假设从1英寸处开始切的.
int q=MIMVALUE;

for(int i=1; i<=j; ++i){

if(q < Price[i]+Earnings[j-i]){
q=Price[i]+Earnings[j-i];
OptimalSulation[j]=i;
Earnings[j]=q;
}
}
}
}

template<unsigned int N, typename T>
void DynamicPlan<N,T>::print()
{
std::cout<<"print Earnings:"<<std::endl;
for(auto out : Earnings){
std::cout<<out<<"  ";
}
std::cout<<std::endl;

std::cout<<"print OptimalSulation:"<<std::endl;
for(auto print : OptimalSulation){
std::cout<<this->length-print<<"  ";
}

std::cout<<std::endl;
}

int main()
{
int arry[]={1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
DynamicPlan<10> myPlan(arry, 3);
myPlan.BottomToUp();
myPlan.print();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: