c++ 动态规划(我已经崩溃了不知道为毛跟书上的结果不一样).算法导论第十五章.

 #include <iostream>
#include <type_traits>
enum:int { MIMVALUE=-999 };
template<unsigned int N, typename T=int>
class DynamicPlan{
 T (&Price)[N];//随着长度的增加对应的总价格. 
 T Earnings[N];//记录收益.
 T OptimalSulation[N];//记录最优解对应的第一段钢条的长度.
 
 int length;//给定的钢条长度. 
 public:
  DynamicPlan(T (&thePrice)[N], const unsigned int& len);
  ~DynamicPlan();
  
  void BottomToUp();
  void print();
};
template<unsigned int N, typename T>
DynamicPlan<N, T>::DynamicPlan(T (&thePrice)[N], 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){
  int q=MIMVALUE;
  
  for(int i=0; i<j; ++i){
   
   if(q < Price[i]+Earnings[j-i]){
    q=Price[i]+Earnings[j-i];
    OptimalSulation[j]=i;
    std::cout<<j<<",";
    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<<print<<"  ";
 }
 std::cout<<std::endl;
}
int main()
{
 int arry[]={1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
 DynamicPlan<10> myPlan(arry, 10);
 myPlan.BottomToUp();
 myPlan.print();
 return 0;
}

你可能感兴趣的:(c++ 动态规划(我已经崩溃了不知道为毛跟书上的结果不一样).算法导论第十五章.)