首页 > 其他分享 >回溯法——0/1背包问题(背包必须装满)

回溯法——0/1背包问题(背包必须装满)

时间:2024-12-17 16:29:38浏览次数:9  
标签:背包 int tw 装满 rw static 回溯 new op

	 public static void main(String[] args) {
         int op[] = new int [n+1];
		 int x[] = new int [5];
		 int rw = 0;
		 for(int i = 1;i<=n;i++)
			 rw+=w[i];//剩余物品重量,初始值为所有物品重量之和
		 dfss(1,0,rw,0,op);
		 printtt();
		 
		 
} 
	 public static int w[] = {0,5,3,2,1};
	 public static int v[] = {0,4,4,3,1};
	 public static int n = 4; 
	 public static int weigh = 6;
	 public static int maxV = 0;
	 public static int[]x = new int[n+1];//记录一下
	 public static void dfss(int i,int tw,int rw,int tv,int op[]) {
		 // tw 现在已经装了多少东西了  rw还剩多少物品等待被装
		 if(i>n) {//找到了叶子节点,
			 
			 if(tw==weigh&&maxV<tv) {//正好装完且现在的价值大于目前的价值
				 maxV = tv;
				 for(int j = 1;j<=n;j++) {
					 x[j] = op[j];//记录  
				 }
			 }
		 }
		 else {
			 if(tw+w[i]<=weigh) {//左剪枝
				 //System.out.println("最大");
				 op[i] = 1;
				 dfss(i+1,tw+w[i],rw-w[i],tv+v[i],op);
			 }
			  if(tw+rw-w[i]>=weigh) {//右剪枝
				 // System.out.println("最大");
				 op[i] = 0;
				 dfss(i+1,tw,rw-w[i],tv,op);
			 }
			 
		 }
	 }
	 public static void printtt() {
		 for(int i = 1;i<=n;i++) {
			 if(x[i]==1){//选了这个包了
				     System.out.print("背包序号为"+i+" ");   
				     System.out.print("背包重量为"+w[i]+" ");  
				     System.out.println("背包价值为"+v[i]+" "); 
			 }
				 
		 }
		 System.out.println("最大价值为"+maxV);
	 }

标签:背包,int,tw,装满,rw,static,回溯,new,op
From: https://blog.csdn.net/qq_62691586/article/details/144534224

相关文章

  • 求幂集(子集)——回溯
    有一个含n个整数的数组a,所有元素均不相同,设计一个算法求其所有子集(幂集)。输出:求解结果{}{3}{2}{23}{1}{13}{12}{123}publicstaticvoidmain(String[]args){inta[]={1,2,3}; intn=3; intx[]=newint[n]; dfs(a,n,0,x);} publicstaticvoiddfs......
  • 0-1背包问题多方法求解
    文章目录问题描述回溯法优先队列式分支限界法动态规划问题描述有一个承重量固定的背包和n个物品,每个物品有各自的重量和价值,每个物品不可分割,需要将物品装入背包中,以达到背包内物品总价值最大的目的,且装入背包的物品总重量不能超过背包的承重量。回溯法确定问题的解......
  • C# 探险之旅:第十八节 - 元组(Tuple):神奇的背包与丢弃的艺术,还有变身大法!
    嘿,探险家们!欢迎再次踏上C#的奇妙旅程。今天,我们要聊的是一个非常实用又有点懒散的旅行伴侣——元组(Tuple)。想象一下,你正准备来一场说走就走的旅行,但是不想带太多行李,只想简单打包几件必需品。元组呢,就像是你的那个轻便背包,能让你轻松打包多件物品,而且不用担心超重!什么是元组?......
  • 动态规划——01背包问题
    01背包问题是一个经典的动态规划问题,虽然基础,之前做过很多遍,但是长时间不接触算法还是会忘记,故记录一下。问题定义:有 N 件物品和一个容量是V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包......
  • 完全背包问题
    问题再现:有N种物品和一个容量是V的背包,每种物品都有无限件可用。第i种物品的体积是vi,价值是wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式:第一行两个整数,N和V,用空格隔开,分别表示物品种数和背包容积。接下来......
  • 01背包问题
    方法一:记忆化搜索#include<algorithm>#include<iostream>#include<cstring>constintN=1000;intn,V;intv[N],w[N];intmem[N][N];intmax(inta,intb){returna>b?a:b;}intdfs(intx,intspV){if(mem[x][spV])returnmem[x][spV];ints......
  • 回溯算法总结
    回溯算法总结组合问题77.组合216.组合总和III17.电话号码的字母组合39.组合总和40.组合总和II131.分割回文串93.复原IP地址78.子集90.子集II491.非递减子序列排列问题46.全排列47.全排列II组合问题77.组合回溯就是用递归枚举所有解递归函数......
  • 背包 dp 一些小 trick 的记录
    前言学习背包dp,遇到了一些觉得有典型性的一些题目,故记录在此,方便以后查看。如果以后发现有价值的会更新。P1417烹调方案01背包。特殊点:物品的价值在动态变化,物品\(1\)在物品\(2\)前先做不一定更优,即无后效性。但由于价值的变化满足式子\(a_i-t\timesb_i\),那么对......
  • 【唐叔学算法】第12天:回溯算法-探索所有可能的旅程
    在算法的世界中,回溯算法是一种通过试错来解决问题的方法。它尝试分步解决一个问题,如果在某个步骤中发现之前的选择并不会导致一个有效的解决方案,它将取消上一步甚至是上几步的选择,回退到之前的状态,再尝试另一种可能的解决方案。作为一名Java技术博主,我将带你深入了解回溯算......
  • 【数据结构与算法】回溯算法:LeetCode“排列问题” 求解,解释并模拟递归+回溯的遍历过程
      【作者自述:记录学习笔记,既然写了就让更多的人看到吧!欢迎大家关注交流学习,一步一个脚印持续更新!】【更多推荐笔记】【数据结构与算法】动态规划:解密“完全背包问题”的真相!附LeetCode四大问题的实现-CSDN博客【数据结构与算法】动态规划:解密“0-1背包问题”的真相!附LeetC......