背包问题--nyoj题目106

背包问题

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入
第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
输出
输出每组测试数据中背包内的物品的价值和,每次输出占一行。
样例输入
1
3 15
5 10
2 8
3 9
样例输出
65

这个题显然是用贪心算法,价值高的取完再去取价值低的;
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 struct as
 7 {
 8     int v;
 9     int w;
10 }aa[11];
11
12
13 bool cmp(as x,as y)
14 {
15     return x.v>y.v;//按价值从高到底排序
16 }
17 int main()
18 {
19     int n,s,m,i;
20     scanf("%d",&n);
21     while(n--)
22     {
23      scanf("%d%d",&s,&m);
24         for(i=0;i<s;i++)
25             scanf("%d%d",&aa[i].v,&aa[i].w);
26         sort(aa,aa+s,cmp);
27         int sum=0;
28         for(i=0;i<s;i++)
29         {
30             if(m>=aa[i].w)
31             {
32                 sum+=aa[i].v*aa[i].w;
33                 m-=aa[i].w;
34             }
35             else
36             {
37                 sum+=m*aa[i].v;
38                 break;
39             }
40         }
41         printf("%d\n",sum);
42     }
43     return 0;
44 }

时间: 2024-08-03 07:04:29

背包问题--nyoj题目106的相关文章

NYOJ题目57 6174问题

----------------------------------------------------- 感觉这个OJ题目难度划分很不合理,这道理明明很简单却给了2的难度,而之前难度为0的水题有好多难死个人没做出来让我暗暗觉得自己脑子里都是屎... 把题目描述翻译成人话的意思就是多少次以后这个序列会出现,想明白这一点就比较简单了. AC代码: 1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main

NYOJ题目1049自增自减

--------------------------------- 简单的字符判断. AC代码: 1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 Scanner sc=new Scanner(System.in); 8 9 int times=Integer.parseInt(sc.nextLine()); 10 while(times-->0

NYOJ题目10505C?5S?

--------------------------------------- 水. AC代码: 1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 Scanner sc=new Scanner(System.in); 8 9 int times=sc.nextInt(); 10 while(times-->0){ 11 double a=sc.n

NYOJ 题目56 阶乘式因式分解(一)

题目描述: 给定两个数m,n,其中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m. 输入 第一行是一个整数s(0<s<=100),表示测试数据的组数随后的s行, 每行有两个整数n,m. 输出 输出m的个数. 样例输入 2 100 5 16 2 样例输出 24 15我的代码://AC #include<stdio.h>int main(){ int s,k; scanf("%d",&s); while(s--)

NYOJ题目28大数阶乘

-------------------------------------祭出BigInteger AC代码: import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); BigInteger ans=fac(n);

NYOJ题目124中位数

------------------------------------- 排序取中间数即可 AC代码: 1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 8 Scanner sc=new Scanner(System.in); 9 10 int times=sc.nextInt(); 11 wh

NYOJ题目168房间安排

------------------------------------------------ 其实就是计算一下时间线上重叠部分的最大值是多少 一个很容易想到的办法就是模拟,如下 AC代码: 1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 Scanner sc=new Scanner(System.in); 8 9 int times=sc.

NYOJ题目125盗梦空间

----------------------------------------- 开始的时候打算每进入或退出一层就换算成那层的时间,然而WA了. 怒,干脆就来点暴力的,管你什么跟什么只要停留了就根据层次统一换算成现实时间,使用BigDecimal保证精度,AC. AC代码: 1 import java.math.BigDecimal; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(

NYOJ题目114某种序列

----------------------------------------- 迭代相加即可 AC代码: 1 import java.math.BigInteger; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 8 Scanner sc=new Scanner(System.in); 9 10 while(sc.hasNextBigInte