长度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