递归方法:牛牛选物品

题目链接:https://ac.nowcoder.com/acm/problem/207796

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的情况,可以放进背包也可以继续不放继续找可能最大的那个重量。

全部评论

相关推荐

03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务