| 长度i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 价格pi | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 30 |
#include <iostream>
#include <string>
#include <limits.h>
using namespace std;
#define KIND_SIZE 11
/** 每种长度的基本价格 */
int price[]={0,1,5,8,9,10,17,17,20,24,30};
int dealMaxProfit(int n , int maxProfit[]);
/**
* 得到最大的利润
* @param n 钢条长度
* @return 最大利润
*/
int getMaxProfit(int n)
{
if( n < 0 || n > KIND_SIZE)
return 0;
int maxProfit[KIND_SIZE];//记录每个长度下的最大利润是多少
for (int i = 0; i < KIND_SIZE ; ++i)
{
maxProfit[i] = INT_MIN;
}
maxProfit[0] = 0;
dealMaxProfit(n , maxProfit);
return maxProfit[n];
}
/**
* 将每个长度对应的比n小的钢条最大利润都保存在maxProfit里面
* @param n 钢条长度
* @param maxProfit 保存最大利润的数组
* @return 返回长度为n的最大利润
*/
int dealMaxProfit(int n , int maxProfit[])
{
if( n == 0)
return 0;
/** 表示之前已经算过了 */
if(maxProfit[n]!= INT_MIN)
return maxProfit[n];
/** 没有算过那么就算一遍 */
int max = INT_MIN;
for (int i = 1; i < n+1; ++i)
{
int temp = price[i]+dealMaxProfit(n-i, maxProfit);
if(max < temp)
max = temp;
}
maxProfit[n] = max;
return max;
}
int main(int argc, char const *argv[])
{
while(1)
{
int steelBarLen;
cout<<"Enter the steel Bar Length(0-10)>";
cin >> steelBarLen;
cout<<"Max profit is : "<<getMaxProfit(steelBarLen)<<endl;
}
return 0;
}#include <iostream>
#include <limits.h>
#include <string>
using namespace std;
#define KIND_SIZE 11
/** 这个是每一个长度下的单价 */
int price[]={0,1,5,8,9,10,17,17,20, 24 ,30};
int dealMaxProfit(int n , int maxProfit[]);
/**
* 得到最大的利润
* @param n 钢条的长度
* @return 最大的利润
*/
int getMaxProfit(int n)
{
if(n < 0 || n > KIND_SIZE)
return 0;
int maxProfit[KIND_SIZE];
for (int i = 0; i < KIND_SIZE; ++i)
{
maxProfit[i] = INT_MIN;
}
maxProfit[0] = 0;
dealMaxProfit(n , maxProfit);
return maxProfit[n];
}
/**
* 处理得到<n长度的利润
* @param n 钢条的长度
* @param maxProfit 最大的利润
* @return 对应长度为n的最大的利润
*/
int dealMaxProfit(int n , int maxProfit[])
{
if(n == 0)
return 0;
for (int i = 1; i <= n; ++i)
{
int max = INT_MIN;
for (int j = 1; j <= i; ++j)
{// 每次都是将最优子结构求出来,再求上层的
int temp = price[j]+maxProfit[i-j];
if(max < temp)
max = temp;
}
maxProfit[i] = max;
}
}
int main(int argc, char const *argv[])
{
while(1)
{
int steelBarLen;
cout<<"Enter the steel Bar Length(0-10)>";
cin >> steelBarLen;
cout<<"Max profit is : "<<getMaxProfit(steelBarLen)<<endl;
}
return 0;
}
/**
* 这个是自顶向下的求法
*/
#include <iostream>
#include <string>
#include <limits.h>
#include <stdio.h>
using namespace std;
#define KIND_SIZE 11
/** 每种长度的基本价格 */
int price[]={0,1,5,8,9,10,17,17,20,24,30};
int dealMaxProfit(int n , int maxProfit[] , int devidePos[]);
/**
* 得到最大的利润
* @param n 钢条长度
* @return 最大利润
*/
int getMaxProfit(int n , int devidePos[])
{
if( n < 0 || n > KIND_SIZE)
return 0;
int maxProfit[KIND_SIZE];//记录每个长度下的最大利润是多少
for (int i = 0; i < KIND_SIZE ; ++i)
{
maxProfit[i] = INT_MIN;
devidePos[i] = i;
}
maxProfit[0] = 0;
dealMaxProfit(n , maxProfit , devidePos);
return maxProfit[n];
}
/**
* 将每个长度对应的比n小的钢条最大利润都保存在maxProfit里面
* @param n 钢条长度
* @param maxProfit 保存最大利润的数组
* @return 返回长度为n的最大利润
*/
int dealMaxProfit(int n , int maxProfit[] , int devidePos[])
{
if( n == 0)
return 0;
/** 表示之前已经算过了 */
if(maxProfit[n]!= INT_MIN)
return maxProfit[n];
/** 没有算过那么就算一遍 */
int max = INT_MIN;
int pos = n;xia
for (int i = 1; i < n+1; ++i)
{
int temp = price[i]+dealMaxProfit(n-i, maxProfit ,devidePos);
if(max < temp)
{
max = temp;
pos = i;
}
}
maxProfit[n] = max;
devidePos[n] = pos;
return max;
}
void printCutSolution(int n , int devidePos[])
{
if(n < 0 || n >= KIND_SIZE)
return ;
if( n == devidePos[n])
{
printf("%s\n", "not devide" );
return;
}
printf("%d steel bar devide into %d and %d \n", n , n - devidePos[n] , devidePos[n] );
printCutSolution(n - devidePos[n] , devidePos);
}
int main(int argc, char const *argv[])
{
while(1)
{
int devidePos[KIND_SIZE];
int steelBarLen;
cout<<"Enter the steel Bar Length(0-10)>";
cin >> steelBarLen;
cout<<"Max profit is : "<<getMaxProfit(steelBarLen , devidePos)<<endl;
printCutSolution(steelBarLen , devidePos);
}
return 0;
}
#include <iostream>
#include <limits.h>
#include <stdio.h>
#include <string>
using namespace std;
#define KIND_SIZE 11
/** 这个是每一个长度下的单价 */
int price[]={0,1,5,8,9,10,17,17,20, 24 ,30};
int dealMaxProfit(int n , int maxProfit[] , int devidePos[]);
/**
* 得到最大的利润
* @param n 钢条的长度
* @return 最大的利润
*/
int getMaxProfit(int n , int devidePos[])
{
if(n < 0 || n > KIND_SIZE)
return 0;
int maxProfit[KIND_SIZE];
for (int i = 0; i < KIND_SIZE; ++i)
{
maxProfit[i] = INT_MIN;
devidePos[i] = i;
}
maxProfit[0] = 0;
dealMaxProfit(n , maxProfit , devidePos);
return maxProfit[n];
}
/**
* 处理得到<n长度的利润
* @param n 钢条的长度
* @param maxProfit 最大的利润
* @return 对应长度为n的最大的利润
*/
int dealMaxProfit(int n , int maxProfit[] , int devidePos[])
{
if(n == 0)
return 0;
for (int i = 1; i <= n; ++i)
{
int max = INT_MIN;
int pos=i;
for (int j = 1; j <= i; ++j)
{// 每次都是将最优子结构求出来,再求上层的
int temp = price[j]+maxProfit[i-j];
if(max < temp)
{
max = temp;
pos = j;
}
}
devidePos[i] = pos;
maxProfit[i] = max;
}
}
void printCutSolution(int n , int devidePos[])
{
if(n < 0 || n >= KIND_SIZE)
return ;
if( n == devidePos[n])
{
printf("%s\n", "not devide" );
return;
}
printf("%d steel bar devide into %d and %d \n", n , n - devidePos[n] , devidePos[n] );
printCutSolution(n - devidePos[n] , devidePos);
}
int main(int argc, char const *argv[])
{
while(1)
{
int devidePos[KIND_SIZE];
int steelBarLen;
cout<<"Enter the steel Bar Length(0-10)>";
cin >> steelBarLen;
cout<<"Max profit is : "<<getMaxProfit(steelBarLen , devidePos)<<endl;
printCutSolution(steelBarLen , devidePos);
}
return 0;
}#include <iostream>
#include <limits.h>
using namespace std;
#define KIND_SIZE 11
#define COST 2 /** 切割的花费 */
/** 每种长度的基本价格 */
int price[]={0,1,5,8,9,10,17,17,20,24,30};
int dealMaxProfit(int , int *);
int getMaxProfit(int n)
{
if(n <=0 || n >= KIND_SIZE)
return 0;
int maxProfit[KIND_SIZE];
for (int i = 0; i <KIND_SIZE; ++i)
{
maxProfit[i] = INT_MIN;
}
dealMaxProfit(n , maxProfit);
return maxProfit[n];
}
int dealMaxProfit(int n , int maxProfit[])
{
maxProfit[0] = 0;
for (int i = 1; i < KIND_SIZE; ++i)
{
int max = INT_MIN;
for (int j = 1; j < i ; ++j)
{
int maxTemp = price[j]+maxProfit[i-j]-COST;
if(max < maxTemp)
max = maxTemp;
}
max = max>price[i]?max:price[i];
maxProfit[i] = max;
}
return maxProfit[n];
}
int main(int argc, char const *argv[])
{
while(1)
{
int steelBarLen;
cout<<"Enter the steel Bar Length(0-10)>";
cin >> steelBarLen;
cout<<"Max profit is : "<<getMaxProfit(steelBarLen)<<endl;
}
return 0;
}原文地址:http://blog.csdn.net/ii1245712564/article/details/44464689