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;