描述
某天KID利用飛行器飛到了一個金銀島上,上面有許多珍貴的金屬,KID雖然更喜歡各種寶石的藝術品,可是也不拒絕這樣珍貴的金屬。但是他只帶着一個口袋,口袋至多隻能裝重量爲w的物品。島上金屬有s個種類, 每種金屬重量不同,分別爲n1, n2, … , ns,同時每個種類的金屬總的價值也不同,分別爲v1,v2, …, vs。KID想一次帶走價值儘可能多的金屬,問他最多能帶走價值多少的金屬。注意到金屬是可以被任意分割的,並且金屬的價值和其重量成正比。
輸入
第1行是測試數據的組數k,後面跟着k組輸入。
每組測試數據佔3行,第1行是一個正整數w (1 <= w <= 10000),表示口袋承重上限。第2行是一個正整數s (1 <= s <=100),表示金屬種類。第3行有2s個正整數,分別爲n1, v1, n2, v2, … , ns, vs分別爲第一種,第二種,…,第s種金屬的總重量和總價值(1 <= ni <= 10000, 1 <= vi <= 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 <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
struct Node
{
double n;
double v;
double x;
bool operator< (const type &t) const
{
return price > t.price;
}node[10000];
double cmp(Node a1,Node a2) //排序規則
{
return a1.x>a2.x;
}
int main()
{
int n,k,maxn;
double ans=0;
cin>>k;
while(k--)
{
ans=0;
cin>>maxn;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>node[i].n>>node[i].v;
node[i].x = node[i].v/node[i].n; //平均
}
sort(node,node+n,cmp);
for(int i=0;i<n;i++)
{
if(maxn>=node[i].n)
{
ans+=node[i].v;
maxn-=node[i].n;
}else
{
ans+=maxn*node[i].x;
break;
}
}
cout<<fixed<<setprecision(2)<<ans<<endl; //控制輸出
}
}
struct Node {
double weight, value, price;
bool operator< (const Node &t) const
{
return price > t.price;
}
};
const int NMAX = 10000;
Node node[NMAX] = {};
結構體一段也可以這樣定義,sort改成sort(node, node+n);
挺好用的一段,個人習慣吧,我不太喜歡在結構體裏面放程序段