1797:金銀島

描述
某天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);挺好用的一段,個人習慣吧,我不太喜歡在結構體裏面放程序段

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章