信奥赛题库 1225:金银岛
代码:
#include <bits/stdc++.h> using namespace std; int main(){ int k;//K次询问 cin>>k;//输入 for(int x = 1;x<=k;x++){//循环K次 int w,s;//称重上限和金属种类 cin>>w>>s;//输入 double n[s+5];//第i种的总重量 double v[s+5];//第i种的总价值 double sum = 0;//记录带走的总价值 for(int i = 1;i<=s;i++){//循环输入 cin>>n[i]>>v[i]; } for(int i = 1;i<s;i++){//冒泡排序排列,确保拿走的是价值最高的 for(int j = i+1;j<=s;j++){ if(v[i]/n[i]<v[j]/n[j]){//总价值和总重量的比进行比较 swap(v[i],v[j]);//交换v[i]和v[j] swap(n[i],n[j]);//交换n[i]和n[j] } } } int i = 1;//数组下标 while(w>0 && i<=s){//结束条件:1.已经装不下物品。2.所有物品已拿完 if(w>n[i]){//判断是否能装下 sum += v[i];//加上这件物品的总价值 w -= n[i];//减去这件物品的总重量,求出剩余空间 }else{//不能装下这整件物品 sum += w/n[i]*v[i];//对物品进行分割,并保证价值最高 w = 0;//已经装不下物品了 } i++;//下标加一 } printf("%.2lf\n",sum);//保留2位小数输出 } return 0;//返回0 }