问题描述:
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. 用path动画绘制水波纹

    用path动画绘制水波纹 效果 源码 // // ViewController.m // PathAnimation // // Created by YouXianMing on 15/7/3. / ...

  2. 手把手教你制作AppPreview视频并上传到appStore进行审核

    手把手教你制作AppPreview视频并上传到appStore进行审核 注意,你需要使用iMovie才能够制作AppPreview视频文件,用QuickTime录制的无效! 最终效果 1. 新建一个事 ...

  3. Linux 系统调整内核参数

    调整系统内核参数 内核优化:Linux系统(内核 + shell + 应用程序)       针对业务服务应用而进行的系统内核参数调整(主要是/etc/sysctl.conf文件) 1. vim /e ...

  4. 关于print缩不缩进%有else没else的影响

    关于print缩不缩进%有else没else的影响 if gender == "男": # = 赋值. == 判断print("上厕所")else: print ...

  5. python_微信 跳一跳

    今天用python刷了一下微信跳一跳游戏得分数. 不是仅仅是玩一玩,而是为了把开发环境搭建好.(这个借口好) 参考: http://blog.csdn.net/LittleBeautiful/arti ...

  6. SQL Server与CLR数据类型的对应关系

    数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean char string date System ...

  7. LRU算法的精简实现(基于Java)

    LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高". impo ...

  8. idea html热部署

    IDEA SpringBoot 热部署+html修改无需make自动刷新 收藏 HeyS1 发表于 3个月前 阅读 310 收藏 2 点赞 0 评论 0 特邀IBM大咖的主题沙龙,5月20日·北京·3 ...

  9. javascript库概念与连缀

    一.JavaScript 库 1.什么是javascript库: javascript库,说白了,就是把各种常用的代码片段,组织起来放在一个 js 文件里,组成一个包,这个包就是 JavaScript ...

  10. SOJ4453 Excel列数 进制转换

    描述 我们都知道Excel的列数是用字母表示的,比如第1列对应A,第27列对应AA. 假设给定一个正整数n,你能给出它所对应的字母表示么? 输入格式 程序需要读入多个测试样例,每个测试样例中: 一个正 ...