1先簡單描述一下這類題的通解思路



下面是一道具體的例題
例題: 設國家撥給60萬元投資,供四個工廠擴建使用,每個工廠擴建后的利潤與投資額的大小有關,投資后的利潤函數如下表所示。

解:依據題意,是要求 f4(60)









根據思路可以模擬出一下代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 int M; 4 int N; 5 int main() 6 { 7 cout << "請輸入工廠的個數和每個工廠所有的可能投資額個數:"<< endl; 8 cin >> M >> N; 9 cout << "請輸入國家最大投資額" << endl; 10 int money; 11 cin >> money; 12 int array[M][N];//每個工廠在所有可能投資額下的獲取利潤 13 int array1[M][N];//在某投資額下前M個工廠可以獲取的最大利潤 14 int path[M][N];//記錄在某總投資額下投資一部分資金給第M個工廠下時獲取最大利潤時這個部分投資額的數值 15 memset(array,0,sizeof(array)); 16 memset(array1,0,sizeof(array1)); 17 memset(path,0,sizeof(path)); 18 cout << "請依次輸入每個工廠在所有可能投資額下的獲取利潤:"<< endl; 19 for(int i=0;i<M;i++){ 20 cout << "請輸入第" << i+1 << "個工廠的所有可能投資額下的獲取利潤:" << endl; 21 for(int j=0;j<N;j++){ 22 cin >> array[i][j]; 23 } 24 } 25 for(int i=0;i<M;i++){ 26 for(int j=0;j<N;j++){ 27 if(i==0){ 28 array1[i][j]=array[i][j]; 29 if(array[i][j]>path[i][j]){//第一個工廠直接全部分配給自己 30 path[i][j]=j;//全部投資額都給自己 31 } 32 } 33 else{ 34 int maxnum=0; 35 for(int k=0;k<N;k++){ 36 if(j-k>=0){//保證投資給除了自己之外的工廠的投資額不能大於總投資額 37 if(array1[i][j]<array[i][k]+array1[i-1][j-k]){//獲取收益最大值時投資給自己的投資額 38 array1[i][j]=array[i][k]+array1[i-1][j-k];//更新 39 path[i][j]=k;//記錄投資給自己多少; 40 } 41 42 } 43 else{ 44 break; 45 } 46 47 } 48 } 49 } 50 } 51 cout <<"最大利潤為" <<array1[M-1][N-1]<< endl; 52 53 //cout << "每個" << endl; 54 money/=10; 55 for(int i=M-1;i>=0;i--){ 56 cout <<"第"<<i+1<<"個工廠投資額為" <<path[i][money]*10<< endl; 57 money-=path[i][money]; 58 59 } 60 61 }
運行結果如下:

