[算法]用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) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...
随机推荐
- CSS学习摘要-布局
注:全文摘自MDN-介绍CSS布局 CSS页面布局技术允许我们拾取网页中的元素,并且控制它们相对正常布局流.周边元素.父容器或者主视口/窗口的位置.在这个模块中将涉及更多关于页面布局技术的细节: 浮动 ...
- Android点击事件
Android点击事件 备注 全局实现View.OnClickListener 或许需要将MainActivity设置为public 注册事件 btn_login.setOnClickListener ...
- AT89S52之串行异步通信笔记
SRF 中断入口地址 中断源 外中断 外部中断0 INT0(P3.2) 外部中断1 INT1(P3.3) 电平方式触发 低电平 脉冲方式触发 脉冲后延的负跳 内中断 定时中断 串行中断 中断允许控制寄 ...
- 我在德国做SAP CRM One Order redesign工作的心得
时间过得很快,今天是我到德国工作的第四周,刚好一个月.Prototype的框架已经搭起来了,现在Order能够在新的框架下正常读写,能跑一些简单的scenario,这些scenario对于end us ...
- HTML、jsp页面中radio,checkbox,select数据回显功能,默认被选中问题
最近常常遇到各种复选框.单选框.下拉框的默认被选中的问题,开始也是绞尽脑汁的想办法,今天写一篇学习总结的博文来写一下学习总结. 单选框(radio)默认被选中: 一.jstl技术进行回显 <in ...
- java String,StringBuilder和StringBuffer
String:1.java语言中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但java一般使用Sting类作为字符串的标准格式,java编译器把字符串值作为String对象. ...
- EventBus轻松使用
什么是EventBus 由greenrobot组织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架,功能:通过解耦发布者和订阅者简化Android事件传递,Event ...
- 为什么说Java中只有值传递----说服自己
在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好阅读本文. 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递.如果是个引用,就 ...
- cascade rcnn论文总结
1.bouding box regression总结: rcnn使用l2-loss 首先明确l2-loss的计算规则: L∗=(f∗(P)−G∗)2,∗代表x,y,w,h 整个loss : L= ...
- @SpringBootApplication无法被解析引入
问题描述:@SpringBootApplication无法被解析引入,导致SpringBoot启动类报错 原因分析:springboot的包冲突了所致 解决方案: 需要删掉 repository\or ...