Poj 1018

有一段时间没练了

传送门:http://poj.org/problem?id=1018

动态规划 背包

最后注意输出

 1 #include<iostream>
 2 #include<cstring>
 3 #include<iomanip>
 4 using namespace std;
 5 
 6 int main(){
 7     int m;
 8     int t;
 9     int B,P;
10     int dp[105][505];
11     cin>>t;
12     while(t--){
13         int n;
14         memset(dp,0,sizeof(dp));
15         cin>>n;
16         cin>>m;
17         while(m--){
18             cin>>B>>P;
19             if(P<dp[1][B]||dp[1][B]==0){
20                 dp[1][B]=P;
21             }
22         }//初始化dp[1]
23         int N=2;
24         while(N<=n){
25             cin>>m;
26             while(m--){
27                 cin>>B>>P;
28                 for(int i=1;i<=500;i++){
29                     if(dp[N-1][i]!=0){
30                         if(i<=B&&dp[N][i]>P+dp[N-1][i]){
31                             dp[N][i]=P+dp[N-1][i];
32                         }
33                         else if(i<=B&&dp[N][i]==0){
34                             dp[N][i]=P+dp[N-1][i];
35                         }
36                         else if(i>B&&dp[N][B]>(P+dp[N-1][i])){
37                             dp[N][B]=P+dp[N-1][i];
38                         }
39                         else if(i>B&&dp[N][B]==0){
40                             dp[N][B]=P+dp[N-1][i];
41                         }
42                     }
43                 }
44             }
45             N++;
46         }
47         double max=0;
48         double temp=0;
49         for(int i=1;i<=500;i++){
50             if(dp[n][i]!=0){
51                 temp=double(i)/double(dp[n][i]);
52                 if(max<temp){
53                     max=temp;
54                 }
55             }
56         }
57         cout<<fixed<<setprecision(3)<<max<<endl;  
58     }
59 }

//#include<iomanip>

//cout<<fixed<<setprecision(3)<<max<<endl;

posted @ 2017-05-17 21:15  水野玛琳  阅读(150)  评论(0编辑  收藏  举报