[算法]用java实现0-1背包和部分背包问题
问题描述:
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背包和部分背包问题的更多相关文章
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化
上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...
- 7种基本排序算法的Java实现
7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...
- 利用朴素贝叶斯算法进行分类-Java代码实现
http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现 鳄鱼 3个月前 (12-14) 分类:机器学习 阅读(44) 评论(0) ...
- 【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】
[053-Maximum Subarray(最大子数组和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Find the contiguous subarray w ...
- 一致性hash算法及java实现
一致性hash算法是分布式中一个常用且好用的分片算法.或者数据库分库分表算法.现在的互联网服务架构中,为避免单点故障.提升处理效率.横向扩展等原因,分布式系统已经成为了居家旅行必备的部署模式,所以也产 ...
- 【LeetCode-面试算法经典-Java实现】【062-Unique Paths(唯一路径)】
[062-Unique Paths(唯一路径)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 A robot is located at the top-left c ...
- 预防和避免死锁的方法及银行家算法的java简单实现
预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...
随机推荐
- Linux 文件的详解[分类/扩展名/inode/block]
关于Linux文件的介绍 Linux里文件扩展名和文件类型没有关系,Linux系统中一切皆文件 关于Linux文件分类 纯文本文件(可以cat的) 二进制文件(Linux的可执行文件等,如/b ...
- 用HashSet存储自定义对象
案例 package cn.itcast_02; import java.util.HashSet; /* * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同, ...
- BlockingQueue笔记
Concurrent包中的BlockingQueue很好的解决了多线程中如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. 通过一个共享 ...
- SVN那些事
非原创,引用于青松世界博客,最近在使用svn,因为方便复制内容在这查看.原地址 https://www.cnblogs.com/Rambo635755402/p/5549447.html Totois ...
- memset struct含有string的崩溃
2019/4/2 补充一下 这里如果填充为0,则不会崩溃,填充为非0时,再次调用赋值就会崩溃 推测非0拷贝破坏了string内部的数据结构,不要对任何类使用memset https://blog.cs ...
- ubuntu 12.04配置mac的Lion主题的风格
1.下载mac壁纸 http://drive.noobslab.com/data/wallpapers/Mac-os-x-Wallpapers%28NoobsLab.com%29.zip 根据自己喜好 ...
- 使用js插件进行设备检测
一.分析新浪网是怎么做的 如新浪网有两种版本,一种是pc版,存放在www.sina.com.cn这个服务器上:另外一种是手机版,存放在www.sina.cn这个服务器上 原理是当用户输入网址www ...
- DA-GAN技术【简介】【机器通过文字描述创造图像】
[题外话:今天上课我做了一个关于DA-GAN技术的ppt演讲,写一点东西留念一下...] 转载请注明出处:https://www.cnblogs.com/GraceSkyer/p/9107471.ht ...
- HttpClient的包含注意事项
HttpClient 功能介绍 以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页. 实现了所有 HTTP 的方法(GET,POST,PU ...
- kubernetes API Server 权限管理实践
API Server权限控制方式介绍 API Server权限控制分为三种:Authentication(身份认证).Authorization(授权).AdmissionControl(准入控制). ...