import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回总体积为V若干物品的最大总重量,如果g存在选择若干物品总体积为V的情况,返回-1
* @param v int整型一维数组
* @param g int整型一维数组
* @param V int整型
* @return int整型
*/
int max = -1;
public int Maximumweight (int[] v, int[] g, int V) {
dfs(v,g,V,0,0);
return max;
}
public void dfs(int[] v, int[] g, int V,int index,int sumG){
//判断,如果V小于0就return
if (V<0||index==v.length&&V!=0) return;
if (V==0){
max = Math.max(max,sumG);
return;
}
//不把当前物品放入背包
dfs(v,g,V,index+1,sumG);
//把当前物品放入背包
dfs(v,g,V-v[index],index+1,sumG+g[index]);
}
}
首先呢,对于递归,开始是听过的,但是太久了就没有用到,所以忘记了,这题和进攻是不同的,也可以说是有些相似的,都是挑尽量打的,但是呢,有一种情况就是如果你把最大的已经放到了map中,如果当有2个相同体积的重量相加最大时,那不是乱套了吗,所以呢,要细心发现题目。在这里,首先要写一个递归函数,递归函数要有成立条件还要有结束条件,那么结束条件就是V<0或者是当下标到了最后一个元素并且V还不为0(即这些体积相加都没有达到要求的数量)那么直接返回-1,成立条件的话呢是当V等于0,也就是体积相加就等于条件所给。接下来的递归就是关键了:背包法,每种情况分两种:放进背包或者不放进背包,按照两条路来走,如果碰到了V=0的情况,可以放进背包也可以继续不放继续找可能最大的那个重量。