博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
背包问题
阅读量:5026 次
发布时间:2019-06-12

本文共 1278 字,大约阅读时间需要 4 分钟。

1.问题

np完全问题 ,给定一组物品,每个都有自己的重量和价格,在限定的总重量内,如何选择使物品的总价格最高

2 基础背包

  N个物品和容量为V的背包,每个物品的重量为w[i] 价值为v[i],求装那些物品可以不超过背包容量且价值最大

 递推公式     f[i][v] = max( f[i-1][v], f[i-1][v-w[i]] + v[i])

  考虑第i物品的策略,如果把第i件物品放入背包,则问题转化为前i-1物品放入剩下容量v-w背包中,此时获得的最大价值是发发f[i-1][v-w[i]]加上第i件物品价值,如果不放如,就转化为前i-1物品放入容量v背包中价值为f[i-1][v]

public int backPack(int m, int[] A) {        // write your code here        boolean[][] f = new boolean[A.length + 1][m + 1];        f[0][0] = true;        for (int i = 1; i <= A.length; i++){            for (int j = 0; j <= m; j++){                f[i][j] = f[i - 1][j];                if (j >= A[i - 1] && f[i][j - A[i - 1]){                    f[i][j] = true;                }            }        }        for (int i = m; i >= 0; i--){            if (f[A.length][i]){                return i;            }        }        return 0;    }
View Code
public int backPackII(int m, int[] A, int V[]) {        // write your code here        if (m == 0 || A.length == 0 || V.length == 0) return 0;        int[] dp = new int[m + 1];        for (int i = 0; i < A.length; i++){            for (int j = m; j >= A[i]; j--){                dp[j] = Math.max(dp[j], dp[j - A[i]] + V[i]);            }        }        return dp[m];    }
View Code

 

转载于:https://www.cnblogs.com/whesuanfa/p/7080412.html

你可能感兴趣的文章
四六级作文常见错误解析(转载)
查看>>
Tomcat
查看>>
./是当前目录 ../是当前的上一级目录。上上级就是../../一般绝对路径时候常用...
查看>>
linux支持FTP和SFTP服务【1】
查看>>
树的递归与非递归遍历方法
查看>>
每天一个Linux命令(6):rmdir命令
查看>>
oracle连接的三个配置文件(转)
查看>>
Vim配置文件(Vimrc)
查看>>
RecyclerView 局部刷新(获取viewHolder 去刷新)
查看>>
PHP表单(get,post)提交方式
查看>>
使用vbs或者bat脚本修改IE浏览器安全级别和选项
查看>>
Silverlight入门
查看>>
Silverlight动态调用WEBSERVICE,WCF方法
查看>>
LeetCode 895. Maximum Frequency Stack
查看>>
模仿segmentfault 评论
查看>>
一个简单的日志函数C++
查看>>
Java 8 中如何优雅的处理集合
查看>>
IOS程序的启动过程
查看>>
连接Linux下 XAMPP集成环境中部署的禅道的数据库MariaDB
查看>>
Java操作Excel和Word
查看>>