[编程之美]饮料供货

动态规划解之

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 }

 

posted @ 2012-03-19 16:16  Cavia  阅读(734)  评论(0编辑  收藏  举报