背包问题(贪心策略)

原创



给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,

使得装入背包中物品的总价值最大?物品时可以拆分的,比如可以将物品的三分之一放入背包。

使用优先放入【价值/重量】最大的物品的贪心策略解题。

 1 import java.util.Scanner;
 2 class sack{    //背包类
 3     private double c;    //背包容量
 4     private double n;    //物品个数
 5     private double w[];    //重量
 6     private double v[];    //价值
 7     private double x[];    //结果向量
 8     public void sort(){
 9         for(int i=1;i<n;i++){
10             for(int j=1;j<n;j++){
11                 if(v[j]/w[j]<v[j+1]/w[j+1]){
12                     double temp;
13                     temp=v[j];
14                     v[j]=v[j+1];
15                     v[j+1]=temp;
16                     temp=w[j];
17                     w[j]=w[j+1];
18                     w[j+1]=temp;
19                 }
20             }
21         }
22     }
23     public sack(double c,double n,double w[],double v[],double x[]){
24         this.c=c;
25         this.n=n;
26         this.w=w;
27         this.v=v;
28         this.x=x;
29     }
30     public double knapsack(){
31         sort();
32         double total=0;
33         for(int i=1;i<=n;i++){
34             x[i]=0;
35         }
36         int i=1;
37         while(w[i]<c){
38             x[i]=1;
39             total+=v[i];
40             c-=w[i];
41             i++;
42         }
43         x[i]=c/w[i];
44         total+=x[i]*v[i];
45         return total;
46     }
47 }
48 public class knapSack {
49
50     public static void main(String[] args) {
51         System.out.print("input n:");
52         Scanner reader=new Scanner(System.in);
53         int n=reader.nextInt();
54         System.out.print("input c:");
55         double c=reader.nextDouble();
56         System.out.print("input weight:");
57         double w[]=new double[n+1];
58         for(int i=1;i<=n;i++){
59             w[i]=reader.nextDouble();
60         }
61         System.out.print("input value:");
62         double v[]=new double[n+1];
63         for(int i=1;i<=n;i++){
64             v[i]=reader.nextDouble();
65         }
66         double x[]=new double[n+1];
67         sack sa=new sack(c,n,w,v,x);
68         System.out.println("bestvalue: "+sa.knapsack());
69     }
70
71 }

23:21:16

2018-11-02

原文地址:https://www.cnblogs.com/chiweiming/p/9899065.html

时间: 2024-11-01 11:54:03

背包问题(贪心策略)的相关文章

到底什么叫贪心策略(内含几个经典贪心样例和三大图论算法)

昨天和前天写完了分治和dp,感觉收获真的挺大的,复习绝不是简单的重复记忆,而是将所学知识融会 贯通的过程,分析各种思想的异同,这些都是在平时学习和刷题的时候没有认真考虑的问题 好了,扯远了 今天分析一下到底什么叫贪心策略 怎么理解贪心:贪心在解决问题上是目光短浅的,仅仅根据当前的已知信息就做出选择,并且一旦做了选择,就不再更改 比如01背包问题,用贪心的话是不可解决的,因为贪心每次只顾眼前最优,即每次选择价值最大的,而忽 略了另外一个变量,物品的重量,如果还考虑物品的重量的话,那就是dp了 贪心

贪心策略 题解(合集)

背包问题[DP] 有一个背包,背包容量是M=150kg.有7个物品,物品不可以分割成任意大小.要求尽可能让装入背包中的物品总价值最大,但不能超过总容量. 01背包 f[j]=max(f[j],f[j-w[i]]+c[i]); 搬书[DP] 陈老师桌上的书有三堆,每一堆都有厚厚的一叠,你想逗一下陈老师,于是你设计一个最累的方式给他,让他把书拿下来给同学们.若告诉你这三堆分别有i,j,k本书,以及每堆从下到上书的质量,每次取书只能从任一堆的最上面取,显然,每次取书陈老师的体力消耗都会加大,这里用体力

【贪心策略】USACO 越野跑

问题 H: 越野跑[贪心策略] [题面] 为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练.贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:奶牛独自进山的时间不得超过M秒(1< =M< =10,000,000). 整条山路被贝茜划分成T个长度相同的小段(1< = T< = 100,000),并且,贝茜用S_i表示第i个小段的路况.S_i为u,f,d这3个字母之一,它们分别表示 第i个小段是上坡.平地,或是下坡. 贝茜要花U秒(1< =U&l

一类区间选择问题的贪心策略

有一类问题在区间上的选择问题有如下特征: 1. 每个选择之间不交叉 2. 区间元素可以在某个选择中,也可以不在任何选择中 3. 最大化选择的个数 对于这类问题,我们可以考虑采取贪心策略.具体来说,对于区间从左到右考虑,每次发现一个可行的组合就选择,保证右区间尽可能小. Codechef CHEFPRAD [给a,b数组,数组内部元素相对位置不变,但ab之间的元素可以同时位移一个距离.每个元素可以匹配和它距离小于y的对面的点,求最大匹配] [观察到最优匹配方案一定是落在b数组某个元素的上边界上(如

LeetCode--Best Time to Buy and Sell Stock (贪心策略 or 动态规划)

Best Time to Buy and Sell Stock Total Accepted: 14044 Total Submissions: 45572My Submissions Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, b

CF10E Greedy Change 判断硬币系统是否能用贪心策略

Billy investigates the question of applying greedy algorithm to different spheres of life. At the moment he is studying the application of greedy algorithm to the problem about change. There is an amount of n coins of different face values, and the c

分数背包问题(贪心算法)

#include<iostream> #include<iterator> #include<vector> #include<algorithm> using namespace std; /* *分数背包问题(贪心算法) */ struct goods { double value;//物品的价值 double weight;//物品的重量 double ratio;//物品的性价比 double in;//物品装入背包的重量 int index;//物

The - Modcrab——使用贪心策略

一.题目信息 The - Modcrab 简单翻译一下:Vova有生命值h1,每次攻击值为a1,每瓶药水恢复生命值c1;Modcrab有生命值h2,每次攻击值为a2.在每个关卡开始,Vova有两种选择,要么攻击怪兽Modcrab,要么喝一瓶药水(Modcrab的生命值允许超过h2),然后,如果战斗没有结束,Modcrab会攻击Vova.战斗结束的标志是Vova(或Modcrab)的生命值降至0,或者更低. 注:1.选择喝药水,Modcrab也会攻击Vova.2.攻击是有先后顺序的 二.算法描述

哈夫曼编码--贪心策略

哈夫曼编码还是在暑假时候看的,那时候并没有看懂因为比较菜(虽然现在也是很菜的),在<趣学算法>一书中这个问题讲解十分到位,我这篇博客真的是难以望其项背,只能对其进行一点借鉴和摘抄吧 哈夫曼编码是一棵树,权值越大的节点越靠近树根,越小的节点就越远离树根,从他的定义来看,首先想到的应该是贪心策略吧,没错就是贪心算法 虽然说是贪心算法,但是还要知道它 的实现方式啊,他的贪心策略是:每次从树的集合中取出没有双亲且权值最小的两棵树作为左右子树,并合并他们 步骤 : 1 :确定合适的数据结构(要知道他的左