1. 程式人生 > >HDU 4968 Improving the GPA

HDU 4968 Improving the GPA

[] div 練習題 esp 數量 條件 最好的 scanf --

五一勞動節的練習題。

隊友看出來是一個背包,另外一個隊友提供了貪心思路ac,在場上想了怎麽背,沒想出來。

然後看題解,結合自己遇到當時的情況,發現用二維數組,一個表示物品的數量一個表示物品的重量,那麽就比較好寫了

#include<bits/stdc++.h>
using namespace std;
//const int va[]={85,80,75,70,60};
//const int vb[]={100,84,79,74,69};
//const double w[]={4.0,3.5,3.0,2.5,2.0};
double v[110];
int cnt;
double ma[20][1010];
double
mi[20][1010]; int main() { //freopen("i.txt","r",stdin); for(int i=85; i<=100; i++)//預先處理 v[i]=4.0; for(int i=80; i<=84; i++) v[i]=3.5; for(int i=75; i<=79; i++) v[i]=3.0; for(int i=70; i<=74; i++) v[i]=2.5; for(int i=60; i<=69; i++) v[i]
=2.0; int T; scanf("%d",&T); while(T--) { int weight; int k; scanf("%d%d",&weight,&k); weight*=k; for(int i=0;i<k;i++) { for(int j=0;j<=weight;j++) { ma[i][j]=0; mi[i][j]
=0x3f3f3f;//把最大值最小值設置一下 } } for(int i=60;i<=100;i++) { ma[0][i]=v[i]; mi[0][i]=v[i]; } for(int i=1;i<k;i++) { for(int j=60;j<=100;j++) { for(int n=0;n<=weight;n++) { if(n-j>=0&&ma[i-1][n-j]!=0)這個條件防止 重量59價值為0這種不存的情況被算入 ma[i][n]=max(ma[i-1][n-j]+v[j],ma[i][n]);//更新 } } } for(int i=1;i<k;i++) { for(int j=60;j<=100;j++) { for(int n=0;n<=weight;n++) { if(n-j>=0&&mi[i-1][n-j]!=0x3f3f3f) mi[i][n]=min(mi[i-1][n-j]+v[j],mi[i][n]); } } } printf("%.4f %.4f\n",mi[k-1][weight]/k*1.0,ma[k-1][weight]/k*1.0); } return 0; }

當然這題數據範圍太小了 直接打出來ma【2-10】【120-1000】是最好的方法

HDU 4968 Improving the GPA