问题描述:
0-1背包问题,部分背包问题(课本P229)
实验要求:
(1)实现0-1背包的动态规划算法求解
(2)实现部分背包的贪心算法求解

0-1背包问题代码:

    public static void main(String[] args){
//获取物品个数,每个物品的重量和价值,以及背包容量
Scanner in1 = new Scanner(System.in);
System.out.println("请输入物品个数和背包容量:");
int num_goods = in1.nextInt();
int capacity = in1.nextInt();
System.out.println("请输入1-"+num_goods+"的物品重量和价值:");
int[] weight = new int[num_goods+1];
int[] value = new int[num_goods+1];
Scanner in2 = new Scanner(System.in);
for(int i = 1;i<=num_goods;i++){
weight[i] = in2.nextInt();
value[i] = in2.nextInt();
}
in1.close();
in2.close();
//动态规划
int[][] f = new int[num_goods+1][capacity+1]; //f[i][j]表示容量为j的背包前i个物品的总价值 for(int i = 1;i<=num_goods;i++){
for(int j = 1; j<=capacity; j++){
if(weight[i] > j){
f[i][j] = f[i-1][j];
}else {
int x = f[i-1][j];
int y = f[i-1][j-weight[i]] +value[i];
f[i][j] = x>y?x:y;
}
}
}
//输出结果
for(int i = 0;i<= num_goods;i++){
for(int j = 0;j<=capacity;j++){
System.out.print(f[i][j]+"\t");
if(j == capacity){
System.out.print("\n");
}
}
}
int j = capacity;
int total_value = 0;
int total_weight = 0;
for(int i = num_goods;i>=1;--i){
if(j>0){
if(j-weight[i] >=0){
if(f[i][j] == (f[i-1][j-weight[i]]+value[i])){
System.out.println("选取物品:"+i+"重量为:"+weight[i]+"价值为:"+value[i]);
j -= weight[i];
total_value += value[i];
total_weight += weight[i];
}
System.out.println("总价值为:"+total_value+"\t总重量为:"+total_weight);
}
}
}
}

二:部分背包

    public class Goods{
int weight;
int value;
float value_per_weight; //value/weight
float load; //占比系数 }
//快排
public static void QuickSort(Goods []A,int l,int r){
Goods temp;
int i = l;
int j = r;
if(l<r){
temp = A[i];
while(i != j){
while(i<j && A[j].value_per_weight <= temp.value_per_weight){
--j;
}
A[i] = A[j];
while(i<j && A[i].value_per_weight >= temp.value_per_weight){
++i;
}
A[j] = A[i];
}
A[i] = temp;
QuickSort(A, l, i-1);
QuickSort(A, i+1, r);
}
}
//贪心算法
public static void Greedy(Goods[] goods,int capacity,int num_goods){
for(int i = 0; i<num_goods; i++){
if(goods[i].weight<capacity){
capacity -= goods[i].weight;
goods[i].load = 1;
}else if(capacity>0){
goods[i].load = ((float)capacity/(float)goods[i].weight);
capacity = 0;
break;
}
}
}
public static void main(String[] args){
float total_value = 0 ;
float total_weight = 0;
//获取物品个数,每个物品的重量和价值,以及背包容量
Scanner in1 = new Scanner(System.in);
System.out.println("请输入物品个数和背包容量:");
int num_goods = in1.nextInt();
int capacity = in1.nextInt();
System.out.println("请输入1-"+num_goods+"的物品重量和价值:");
Goods[] goods = new Goods[num_goods];
Scanner in2 = new Scanner(System.in);
for(int i = 0;i<num_goods;i++){
goods[i] = new part_of_package_greedy().new Goods();;
goods[i].weight = in2.nextInt();
goods[i].value= in2.nextInt();
goods[i].value_per_weight = (goods[i].value)/(goods[i].weight);
}
in1.close();
in2.close();
QuickSort(goods,0,(num_goods-1));
//执行贪心算法
Greedy(goods, capacity, num_goods);
System.out.println("执行贪心算法求得部分背包解为:");
for(int i = 0;i<num_goods;i++){
System.out.println("重量为:"+goods[i].weight+"\t价值为:"+goods[i].value+"\t装载率为:"+goods[i].load);
total_value+=goods[i].value*goods[i].load;
total_weight+=goods[i].weight*goods[i].load;
}
System.out.println("背包容量:"+capacity+"\t背包装入重量:"+total_weight+"\t装入总价值:"+total_value);
}

[算法]用java实现0-1背包和部分背包问题的更多相关文章

  1. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  2. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  3. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  4. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  5. 7种基本排序算法的Java实现

    7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...

  6. 利用朴素贝叶斯算法进行分类-Java代码实现

    http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现  鳄鱼  3个月前 (12-14)  分类:机器学习  阅读(44)  评论(0) ...

  7. 【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】

    [053-Maximum Subarray(最大子数组和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Find the contiguous subarray w ...

  8. 一致性hash算法及java实现

    一致性hash算法是分布式中一个常用且好用的分片算法.或者数据库分库分表算法.现在的互联网服务架构中,为避免单点故障.提升处理效率.横向扩展等原因,分布式系统已经成为了居家旅行必备的部署模式,所以也产 ...

  9. 【LeetCode-面试算法经典-Java实现】【062-Unique Paths(唯一路径)】

    [062-Unique Paths(唯一路径)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 A robot is located at the top-left c ...

  10. 预防和避免死锁的方法及银行家算法的java简单实现

    预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...

随机推荐

  1. Linux 文件的详解[分类/扩展名/inode/block]

    关于Linux文件的介绍 Linux里文件扩展名和文件类型没有关系,Linux系统中一切皆文件 关于Linux文件分类 纯文本文件(可以cat的)     二进制文件(Linux的可执行文件等,如/b ...

  2. 用HashSet存储自定义对象

      案例 package cn.itcast_02; import java.util.HashSet; /* * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同, ...

  3. BlockingQueue笔记

    Concurrent包中的BlockingQueue很好的解决了多线程中如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. 通过一个共享 ...

  4. SVN那些事

    非原创,引用于青松世界博客,最近在使用svn,因为方便复制内容在这查看.原地址 https://www.cnblogs.com/Rambo635755402/p/5549447.html Totois ...

  5. memset struct含有string的崩溃

    2019/4/2 补充一下 这里如果填充为0,则不会崩溃,填充为非0时,再次调用赋值就会崩溃 推测非0拷贝破坏了string内部的数据结构,不要对任何类使用memset https://blog.cs ...

  6. ubuntu 12.04配置mac的Lion主题的风格

    1.下载mac壁纸 http://drive.noobslab.com/data/wallpapers/Mac-os-x-Wallpapers%28NoobsLab.com%29.zip 根据自己喜好 ...

  7. 使用js插件进行设备检测

    一.分析新浪网是怎么做的   如新浪网有两种版本,一种是pc版,存放在www.sina.com.cn这个服务器上:另外一种是手机版,存放在www.sina.cn这个服务器上 原理是当用户输入网址www ...

  8. DA-GAN技术【简介】【机器通过文字描述创造图像】

    [题外话:今天上课我做了一个关于DA-GAN技术的ppt演讲,写一点东西留念一下...] 转载请注明出处:https://www.cnblogs.com/GraceSkyer/p/9107471.ht ...

  9. HttpClient的包含注意事项

    HttpClient 功能介绍 以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页. 实现了所有 HTTP 的方法(GET,POST,PU ...

  10. kubernetes API Server 权限管理实践

    API Server权限控制方式介绍 API Server权限控制分为三种:Authentication(身份认证).Authorization(授权).AdmissionControl(准入控制). ...