背包问题递归java

 1 public boolean PackageProblem(int[] arr,int start,int left,int target)
 2     {
 3         if(arr.length==0)
 4         {
 5             System.out.println("no Answer");
 6             return false;
 7         }
 8         if(start==arr.length)
 9         {
10             int[] tempArr=new int[arr.length-1];
11             System.arraycopy(arr, 1, tempArr, 0, arr.length-1);15             return PackageProblem(tempArr, 0, target, target);
16         }
17         else if(arr[start]>left)
18         {
19             return PackageProblem(arr, start+1, left, target);
20         }
21         else if(arr[start]==left)
22         {
23             System.out.println("yes has answer");
24             return true;
25         }
26         else{
27             return PackageProblem(arr, start+1, left-arr[start], target);
28         }
29
30     }

int[] arr={11,10,8,7,5,3};
int target=21;

但是这个数组要是从大到小排好的?

int[] arr={11,8,7,5,3,10};就不行

时间: 2024-08-25 19:49:30

背包问题递归java的相关文章

编程算法 - 背包问题(递归) 代码(C)

背包问题(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个重量和价值分别为w,v的物品, 从这些物品中挑选出总重量不超过W的物品, 求所有挑选方案中价值总和的最大值. 即经典动态规划问题. 可以使用深度优先搜索, 把每个部分都遍历到, 选取最优解, 但不是最好的方法. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gc

归并排序(非递归,Java实现)

归并排序(非递归): public class MergeSort { /** * @param arr 待排序的数组 * @param left 本次归并的左边界 * @param mid 本次归并的中间位置,也就是分界线 * @param right 本次归并的右边界 * @param <T> 泛型 * @local aux 辅助空间(Auxiliary Space) */ private static <T extends Comparable<? super T>&g

01背包问题(Java实现)

关于背包问题,百度文库上有崔添翼大神的<背包九讲>,不明的请移步查看.这里仅介绍最基本的01背包问题的实现. 1 public class Knapsack { 2 private final int MIN = Integer.MIN_VALUE; 3 4 @org.junit.Test 5 public void test() { 6 int[] w = {3, 2, 2}; 7 int[] v = {5, 10, 20}; 8 knapsackOptimal(5, w, v); 9 }

背包问题---递归及动态规划

一.原题 如果有一组物品,各个物品的质量已知,现有一个背包,背包可以容纳的质量总和S已知,问是否能从这N个物品中取出若干个恰好装入这个背包中. 二.递归算法 本质思想:设法尝试全部组合,当部分组合已经无法满足条件时,马上停止当前组合的尝试:若出现第一个满足条件的组合,马上停止尝试.使用递归回溯法实现.(感觉这东西不是我这样的菜鸟可以说明确的,还得自己慢慢体会,最好的方法就是耐住性子跟踪调试). 上"酸菜" #include <stdio.h> #include <st

14.背包问题[递归实现]

/*------------完整代码@映雪-------------*/ /*初始化一组数据,省却输入,方便调试*/ #include <iostream> using namespace std; typedef struct { int value[5];/*价值表*/ int weight[5];/*重量表*/ int num;/*数量*/ int limitw;/*最大重量*/ int select[5]; }Goods; int maxvalue=0,totalvalue=115;/

数据结构--汉诺塔递归Java实现

1 /*汉诺塔递归 2 * 1.将编号0-N-1个圆盘,从A塔座移动到B上面 3 * 2.将编号N的1个圆盘,从A移动到C上面 4 * 3.最后将B上面的N-1个圆盘移动到C上面 5 * 注意:盘子的编号从上到下1-N 6 * */ 7 public class HannoTower_Recursion { 8 9 public static void main(String[] args) { 10 int nDisk = 3; 11 doTowers(nDisk,'A','B','C');

数据结构--汉诺塔--借助栈实现非递归---Java

1 /*汉诺塔非递归实现--利用栈 2 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 3 * 2.先进栈,在利用循环判断是否栈空, 4 * 3.非空情况下,出栈,检查是否只有一个盘子--直接移动,否则就模拟前面递归的情况--非1的情况 5 * 4.直到栈空就结束循环,就完成全部的移动. 6 * */ 7 class Stack11{ 8 Towers[] tt = new Towers[20]; 9 int top = -1; 10 11 public boolean i

最容易理解的二叉树后续遍历非递归java实现

后续遍历要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈.如果P不存在左孩子和右孩子,则可以直接访问它:或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点.若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问. java private static void postOrderNonRecursiveEasily(Node root) {

回溯法-01背包问题之一:递归模式

一.回溯法 回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中按照深度优先的策略,从根节点出发搜索解空间树.算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包含问题的解.如果肯定不包含,则跳过对以该节点为根的子树的系统搜索,逐层向其原先节点回溯.否则,进入该子树,继续按深度优先的策略进行搜索. 运用回溯法解题通常包含以下三个步骤: · 针对所给问题,定义问题的解空间: · 确定易于搜索的解空间结构: · 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函