ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

8.8几个背包问题

2020-04-26 20:00:43  阅读:257  来源: 互联网

标签:背包 几个 8.8 物体 wi int Job getPrice 重量


/**
最优装载问题:
给出n个物体,第i个物体重量为wi,选择尽量多的物体,使得重量不超过c
 */

思路:
先把物体重量进行从小到大的排序,在把排序后的物体挨个放入,如果重量小于c就计数+1,否则就是大于了c直接break退出循环。

 1     private static int f(int n, int[] wi, int c) {
 2         int cnt = 0;
 3         int sum = 0;
 4         for(int i = 0; i < n; i++){
 5             sum += wi[i];
 6             if(sum <= c){
 7                 cnt++;
 8             }else{
 9                 break;
10             }
11         }
12         return cnt;
13     }
14     public static void main(String[] args) {
15         Scanner in = new Scanner(System.in);
16         int n = in.nextInt();
17         int[] wi = new int[n];
18         for(int i = 0; i < n; i++){
19             wi[i] = in.nextInt();
20         }
21         int c = in.nextInt();
22         Arrays.sort(wi);
23         System.out.println(f(n,wi,c));
24     }

 

 

/**
部分背包问题:
有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过C的情况下让总价值尽量高。
每一个物体都可以只取走一部分,价值和重量按比例计算。求最大总价值
注意:每个物体可以只拿一部分,因此一定可以让总重量恰好为C。
 */

思路:
写一个物体类实现Comparable,属性有重量有价值,有构造函数,有获取总价值的方法(价值/(double)重量),compareTo中比较总价值。
主方法中先用Arrays.sor排序,排序后价值是从低到高的,所有我们循环是(i=n-1; i >=0; i--)如果当前物体的重量 <= C,那么总价值 += 当前物体的价值,且C -= 当前物体的重量,
否则就是当前物体重量 > C,那么总价值 += 当前物体的价值*( C/当前物体的重量),然后break

 1     public static class Job implements Comparable<Job>{
 2         int w;
 3         int v;
 4 
 5         public Job(int w, int v) {
 6             super();
 7             this.w = w;
 8             this.v = v;
 9         }
10         
11         public double getPrice(){
12             return v/(double)w;
13         }
14 
15         @Override
16         public int compareTo(Job other) {
17             if(this.getPrice() == other.getPrice())
18                 return 0;
19             else if(this.getPrice() > other.getPrice())
20                 return 1;
21             else
22                 return -1;
23         }
24     }
25     public static void main(String[] args) {
26 
27         Scanner in = new Scanner(System.in);
28         int n = in.nextInt();
29         int[] wi = new int[n];
30         int[] vi = new int[n];
31         for(int i = 0; i < n; i++){
32             wi[i] = in.nextInt();
33         }
34         for(int i = 0; i < n; i++){
35             vi[i] = in.nextInt();
36         }
37         double c = in.nextInt();
38         
39         Job[] jobs = new Job[n];
40         for(int i = 0; i < n; i++){
41             jobs[i] = new Job(wi[i], vi[i]);
42         }
43         Arrays.sort(jobs);
44         double maxValue = 0;
45         for(int i = n-1; i >=0; i--){
46             if(jobs[i].w <= c){
47                 maxValue += jobs[i].v;
48                 c -= jobs[i].w;
49             }else{
50                 maxValue += jobs[i].v*(c/jobs[i].w);
51                 break;
52             }
53         }
54         System.out.println(maxValue);
55     }

 

标签:背包,几个,8.8,物体,wi,int,Job,getPrice,重量
来源: https://www.cnblogs.com/z1110/p/12781872.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有