1. 程式人生 > >貪心之oj.1797

貪心之oj.1797

1797:金銀島

總時間限制:
3000ms
記憶體限制:
65536kB
描述
某天KID利用飛行器飛到了一個金銀島上,上面有許多珍貴的金屬,KID雖然更喜歡各種寶石的藝術品,可是也不拒絕這樣珍貴的金屬。但是他只帶著一個口袋,口袋至多隻能裝重量為w的物品。島上金屬有s個種類, 每種金屬重量不同,分別為n 1, n 2, ... , n s,同時每個種類的金屬總的價值也不同,分別為v 1,v 2
, ..., v s。KID想一次帶走價值儘可能多的金屬,問他最多能帶走價值多少的金屬。注意到金屬是可以被任意分割的,並且金屬的價值和其重量成正比。
輸入
第1行是測試資料的組數k,後面跟著k組輸入。

每組測試資料佔3行,第1行是一個正整數w (1 <= w <= 10000),表示口袋承重上限。第2行是一個正整數s (1 <= s <=100),表示金屬種類。第3行有2s個正整數,分別為n 1, v 1, n 2, v 2, ... , n s, v s分別為第一種,第二種,...,第s種金屬的總重量和總價值(1 <= n i
<= 10000, 1 <= v i <= 10000)。
輸出
k行,每行輸出對應一個輸入。輸出應精確到小數點後2位。
樣例輸入
2
50
4
10 100 50 30 7 34 87 100
10000
5
1 43 43 323 35 45 43 54 87 43
樣例輸出
171.93
508.00

------------------------------------------------------------------------------------------------------------------------------------------------------------------
自己的程式碼:
#include<cstdio>
#include<algorithm>
using namespace std;
struct zhubao
{
 double wei,vau,avr;
}a[10005];
bool cmp(zhubao &x,zhubao &y)
{
 return x.avr>y.avr;
}
int main()
{
 int n,w,s;
 scanf("%d",&n);
 for(int q=1;q<=n;q++)
 {
  double totwei=0,tot=0;
  scanf("%d%d",&w,&s);
  for(int j=1;j<=s;j++)
  {
   scanf("%lf%lf",&a[j].wei,&a[j].vau);
   a[j].avr = a[j].vau/a[j].wei; 
  }
  sort(a+1,a+s+1,cmp);
  for(int i=1;i <= s;i++)
  {
   if(a[i].wei+totwei<=w)
   {
    totwei+=a[i].wei;
    tot+=a[i].vau;
   }
   else
   {
    int sum=0;
    sum=w-totwei;
    tot+=sum*a[i].avr;
    break;
   }
  }
  printf("%.2lf\n",tot);
 } 
 return 0;
}

主要是比較每塊珠寶的平均價 評均價個高的優先 就可以做到最後得到的是最高的
無後效性:不改變每塊的價值


寫了好久啊 終於d完了
錯因:tot 沒有清0
   else 中 tot算的不對 用之前算過的平均價值算才對