1353: 背包问题发表时间:2022-10-28 23:23 1353: 背包问题 时间限制: 1 Sec 内存限制: 128 MB 题目描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=100);如果给你一个背包它能容纳的重量为m(10<=m<=200),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。 输入 第一行输入一个正整数n(1<=n<=5),表示有n组测试数据; 输出 输出每组测试数据中背包内的物品的价值和,每次输出占一行。 样例输入 Copy 1 3 15 5 10 2 8 3 9 样例输出 Copy 65
解析:考虑到物品可以分割。其实我们只要不断装单价最高的物品就行。贪心算法。 #include<bits/stdc++.h> using namespace std; struct Node{ int v,w; }a[15]; int n,s,m; bool cmp(Node x,Node y){return x.v>y.v;} int main(){ scanf("%d",&n); while(n--){ scanf("%d%d",&s,&m); for(int i=1;i<=s;i++) scanf("%d%d",&a[i].v,&a[i].w); sort(a+1,a+1+s,cmp); int ans=0,i=1; while(m){ if(i>s) break; if(a[i].w>=m){ans+=m*a[i].v;break;} ans+=a[i].w*a[i].v; m-=a[i].w;i++; } printf("%d\n",ans); } return 0; }
文章分类:
算法例题
|