当前位置: 首页 > news >正文

济南制作网站的公司wordpress会员关注

济南制作网站的公司,wordpress会员关注,营销项目策划公司,用thinkphp做的网站引言 背包问题是计算机科学领域的一个经典优化问题,分为多种类型,其中最常见的是0-1背包问题和完全背包问题。这两种问题的核心在于如何在有限的空间内最大化收益,但它们之间存在一些关键的区别:0-1背包问题允许每个物品只能选择…

引言

背包问题是计算机科学领域的一个经典优化问题,分为多种类型,其中最常见的是0-1背包问题和完全背包问题。这两种问题的核心在于如何在有限的空间内最大化收益,但它们之间存在一些关键的区别:0-1背包问题允许每个物品只能选择一次,而完全背包问题则允许无限次选取同一物品。本篇博客将分别介绍这两个问题的动态规划解法,并附带相应的Java代码实现。

0-1背包问题

问题描述

假设你有一个背包,其最大承重能力为W千克,现在有一系列物品,每个物品有自己的重量Wi和价值Vi。你的任务是从这些物品中挑选一部分装入背包,使得背包的价值尽可能大,但不能超过背包的最大承重限制。

解决方案

我们可以采用动态规划的方法来求解这个问题。定义一个二维数组dp[i][j]表示从前i个物品中选择若干个放入容量为j的背包所能获得的最大价值。状态转移方程

Java代码实现

package dp;import java.util.ArrayList;
import java.util.List;public class Knapsack {public static void main(String[] args) {int n = 4; // 物品数量int bagweight = 16; // 背包最大容量int[] weight = {5, 7, 3, 4}; // 物品重量int[] value = {2, 5, 8, 1}; // 物品价值// 初始化 dp 数组int[][] dp = new int[n + 1][bagweight + 1];// 动态规划填充 dp 数组for (int i = 1; i <= n; i++) {for (int j = 0; j <= bagweight; j++) {if (j < weight[i - 1]) {dp[i][j] = dp[i - 1][j]; // 不选择当前物品} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); // 选择或不选择当前物品}}}// 输出最大价值System.out.println("最大价值: " + dp[n][bagweight]);// 回溯找到具体的物品List<Integer> selectedItems = new ArrayList<>();int i = n, j = bagweight;while (i > 0 && j > 0) {if (dp[i][j] != dp[i - 1][j]) {selectedItems.add(i - 1); // 物品索引从0开始j -= weight[i - 1];}i--;}// 输出选择的物品System.out.print("选择的物品: ");for (int item : selectedItems) {System.out.print(item + " (重量: " + weight[item] + ", 价值: " + value[item] + ") ");}System.out.println();}
}

完全背包问题

问题描述

完全背包问题与0-1背包问题类似,不同之处在于每个物品的数量不限,即你可以无限制地选择同一个物品。

解决方案

对于完全背包问题,我们需要稍微修改一下状态转移方程。由于每个物品都可以多次选择,因此需要在循环中考虑是否要加入该物品到背包中。

  1. 状态表示

    • dp[i][j] 表示前 i 种物品放入容量为 j 的背包里任意取的最大价值。
  2. 确定边界和遍历顺序

    • 先遍历背包重量 (内层),再遍历物品 (外层循环)。
      for(int i=1;i<=n;i++) // 物品数量for(int j=1;j<=m;j++) // 背包容量if(j>=w[i]) // 判断是否能放得下第i件物品dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); // 更新dp数组else dp[i][j]=dp[i-1][j]; // 不选第i件物品
  3. 找到状态转移方程

    • 状态转移方程是关键部分,它描述了如何从已知的状态推导出新的状态。
      dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
    • 这意味着,对于每一件物品,可以选择放进去或者不放,比较两种情况下所能获得的最大价值。

Java代码实现

package dp;import java.util.ArrayList;
import java.util.List;public class AllPack {public static void main(String[] args) {int n = 3; // 物品数量int bagweight = 7; // 背包最大容量int[] weight = {3, 4, 2}; // 物品重量int[] value = {4, 5, 3}; // 物品价值// 初始化 dp 数组int[][] dp = new int[n + 1][bagweight + 1];// 动态规划填充 dp 数组for (int i = 1; i <= n; i++) {for (int j = 0; j <= bagweight; j++) {dp[i][j] = dp[i - 1][j]; // 不选择当前物品if (j >= weight[i - 1]) {dp[i][j] = Math.max(dp[i][j], dp[i][j - weight[i - 1]] + value[i - 1]); // 选择或不选择当前物品}}}// 输出最大价值System.out.println("最大价值: " + dp[n][bagweight]);// 回溯找到具体的物品List<Integer> selectedItems = new ArrayList<>();int i = n, j = bagweight;while (i > 0 && j >= 0) {if (j >= weight[i - 1] && dp[i][j] != dp[i - 1][j]) {selectedItems.add(i - 1); // 物品索引从0开始j -= weight[i - 1];}i--;}// 输出选择的物品System.out.print("选择的物品: ");for (int item : selectedItems) {System.out.print(item + " (重量: " + weight[item] + ", 价值: " + value[item] + ") ");}System.out.println();}
}

  1. 0-1背包问题

    • 每个物品只能选择一次。
    • 回溯逻辑中,一旦确定选择了某个物品,就从当前的背包容量中减去该物品的重量,并且继续回溯下一个物品。
  2. 完全背包问题

    • 每个物品可以选择多次,直到背包容量不允许为止。
    • 回溯逻辑中,需要检查在当前背包容量下可以选择该物品的次数。这通常涉及到一个循环,直到背包容量不足以再添加一个该物品为止。
http://www.yayakq.cn/news/557708/

相关文章:

  • 网站如何引导客户企业自己可以做视频网站吗
  • 为什么要建设网站阿里巴巴网站的建设内容
  • 深圳市做网站公司公司建网站多少
  • 襄阳购物网站开发设计一个县城广告公司利润
  • 网站建设后台管理登陆代码网站内容图片怎么做
  • 加速百度对网站文章的收录门户网站域名
  • 网站设计毕业设计网站建设流程心得
  • 做网站用哪个eclipse微网站外链
  • 昆明网站建设时间sap软件
  • 温州专业微网站制作公司哪家好查域名被墙
  • 上海建设银行官网网站6网站制作报价黑河
  • 网站ui需求成功的微网站
  • 东莞哪家网站建设比较好适合小学生摘抄的新闻2022年
  • 合肥红酒网站建设查找网站建设虚拟目录
  • 建设部网站最新消息网页qq注册新账号免费
  • 百度搜索搜不到网站广州建设工程交易中心专题片
  • 邢台网站优化公司深圳seo优化关键词排名
  • 网站空间托管wordpress video标签
  • 上海做网站好的公司北京网站建设58
  • 建设部网标准下载网站中国十大网站开发公司
  • 网站源码上传完后怎么做台州做网站多少钱
  • wordpress英文换成中文字体山西网站seo
  • 做网站的公司风险大不大烟台网站制作维护
  • 昆明快速建站模板宝安西乡做网站
  • 网站开发 京东ysl千人千色t9t9t9t9
  • 高校网站建设前言文档阅读网站模板下载
  • c 语言做网站看摄影作品的网站
  • 用ps做网站广告图上海网站建设在哪
  • 双德网站建设企业注册百家号可以做网站吗
  • 网站怎么换空间南京建设银行官方网站