动态规划解之
http://www.cnblogs.com/daniagger/archive/2012/03/19/2406235.html
View Code
1 /* 2 总共n中饮料,每种饮料表示为(S[i],V[i],C[i],H[i],B[i]),S表示名称,V表示容量,C表示可能的最大容量,H表示满意度,B表示实际购买量 3 V[i]*B[i]求和=V的情况下,H[i]*B[i]求和最大化 4 */ 5 6 #include <iostream> 7 using namespace std; 8 9 struct Beverage 10 { 11 int volumn; 12 int maxOffer; 13 int satisfication; 14 int purchase; 15 }; 16 17 int V; 18 int maxSatisfy; 19 20 int DP(Beverage* b,int n) 21 { 22 int** M=new int*[V+1]; 23 for(int i=0;i<=V;++i) 24 M[i]=new int[n]; 25 26 for(int i=0;i<=V;++i) 27 { 28 if(i/b[n-1].volumn>b[n-1].maxOffer) 29 M[i][n-1]=b[n-1].satisfication*b[n-1].maxOffer; 30 else 31 M[i][n-1]=b[n-1].satisfication*(i/b[n-1].volumn); 32 } 33 for(int i=0;i<=V;++i) 34 for(int j=0;j<n-1;++j) 35 M[i][j]=-999; 36 37 for(int j=n-2;j>=0;--j) 38 { 39 for(int i=0;i<=V;++i) 40 { 41 for(int k=0;k<=b[j].maxOffer;++k) 42 { 43 if(b[j].volumn*k<=i) 44 { 45 if(b[j].satisfication*k+M[i-b[j].volumn*k][j+1]>M[i][j]) 46 { 47 M[i][j]=b[j].satisfication*k+M[i-b[j].volumn*k][j+1]; 48 b[n].purchase=k; 49 } 50 } 51 } 52 } 53 } 54 return M[V][0]; 55 } 56 57 int main() 58 { 59 int num; 60 cout <<"enter the number of kinds of beverages:"; 61 cin >>num; 62 Beverage* beve=new Beverage[num]; 63 cout <<"enter the max volumn:"; 64 cin >>V; 65 maxSatisfy=DP(beve,num); 66 cout <<"The max satisfication is "<<maxSatisfy<<endl; 67 return 0; 68 }