NC15588. 一个背包问题
描述
现在有很多物品(它们是可以任意分割的),我们知道它们每个物品的总价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(0<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入描述
第一行输入两个正整数s,m,(1<=s<=10)以空格分隔,s表示有s个物品。接下来的s行每行有两个用空格分隔的正整数v,w。
输出描述
输出每组测试数据中背包内的物品的价值和,保留2位小数,每次输出占一行。
示例1
输入:
5 5 5 2 5 3 6 2 4 3 10 2
输出:
18.50
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 392K, 提交时间: 2022-11-09 19:17:04
/*@刘学谦*/ #include<bits/stdc++.h> using namespace std; typedef struct good{ double v,w; double c; }good; bool cmp(good x,good y){ return x.c>y.c; } int main(void) { good G[15]; int s,m; cin>>s>>m; for(int i = 0;i<s;i++){ cin>>G[i].v>>G[i].w; G[i].c = G[i].v/G[i].w; } sort(G,G+s,cmp); int N = m; double ans = 0; for(int i = 0;i<s&&N!=0;i++){ if(N>=G[i].w){ ans = ans+G[i].v; N = N-G[i].w; }else{ ans = ans+N*G[i].c; N = 0; } } printf("%.2lf",ans); return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 408K, 提交时间: 2022-03-05 14:44:15
#include <bits/stdc++.h> using namespace std; int s,m,k=0,a[120],b[120],f[120][200005]; int main() { cin>>s>>m; for(int i=1;i<=s;i++) { cin>>a[i]>>b[i]; k+=b[i]; } int g=1; double c[k]; for(int i=1;i<=k;i++) { double t=a[i]*1.0/b[i]; for(int j=g;j<g+b[i];j++) { c[j]=t; } g+=b[i]; } sort(c+1,c+1+k); double ans=0; while(m--) { ans+=c[k]; k--; } printf("%.2lf",ans); return 0; }
pypy3(pypy3.6.1) 解法, 执行用时: 38ms, 内存消耗: 18680K, 提交时间: 2021-04-14 23:11:10
N, M = map(int,input().split()) f = [] for i in range(N): t = [] t = list(map(int,input().split())) t.append(t[0]/t[1]) f.append(t) f.sort(key=lambda x:x[2], reverse = True) max_value = 0 for i in range(len(f)): if M >= f[i][1]: M -= f[i][1] max_value += f[i][0] else: max_value += (M * f[i][2]) break print("{:.2f}".format(max_value))
Python3(3.5.2) 解法, 执行用时: 37ms, 内存消耗: 3432K, 提交时间: 2020-05-31 21:41:56
n,m = [int(a) for a in input().split()] X = [[int(a) for a in input().split()] for i in range(n)] X.sort(key=lambda x:x[1]/x[0]) r = 0 for x in X: if m>x[1]: r,m = r+x[0],m-x[1] else: r += x[0]*m/x[1] break print('{:.2f}'.format(r))