【问题标题】:Dynamic Programming:Subset Logic动态规划:子集逻辑
【发布时间】:2017-01-07 23:00:38
【问题描述】:

给定一个整数数组,是否可以选择一组整数,从起始索引开始,使得组和给定目标?但是,必须选择所有 6 的附加约束。

groupSum6(0, [5, 6, 2], 8) → 真

groupSum6(0, [5, 6, 2], 9) → 假

groupSum6(0, [5, 6, 2], 7) → 假

只是想弄清楚我哪里出错了。为 nums[start] == 6 声明一个特殊情况是错误的方法吗?

public boolean groupSum6(int start, int[] nums, int target) {

 if (nums[start] >= nums.length) {return (target == 0);} 

 if (nums[start] == 6){ 
 return groupSum6(start++, nums, target - nums[start]);
 }

 if (groupSum6(start++, nums, target - nums[start])) {return true;}
 //if a particular number is choosen 

 if (groupSum6(start++, nums, target)) {return true;}
 //if that particular  number is not chosen

 return false;
}

【问题讨论】:

    标签: java


    【解决方案1】:

    问题:方法 checkValue 中整数 a 的值是多少?

    int a = 4;
    checkValue(a++);
    void method(int value){
        System.out.println(a);
    }
    
    public boolean groupSum6(int start, int[] nums, int target) {
    
        if (start == nums.length) {return (target == 0);} //why did you compare some arbitrary number from array with length of this array? 
    
        if (nums[start] == 6){
            return groupSum6(start+1, nums, target - nums[start]);
        }
    
        if (groupSum6(start+1, nums, target - nums[start])) {return true;} //when you use start++ , you are calling the method with the same argument (i.e. start) recursively
        //if a particular number is choosen 
    
        if (groupSum6(start+1, nums, target)) {return true;}
        //if that particular  number is not chosen
    
        return false;
    }
    

    顺便说一句。你可以用更少的代码行:

    public boolean groupSum6(int start, int[] nums, int target) {
    
        if (start == nums.length) {return (target == 0);}
    
        else if (nums[start] == 6){
            return groupSum6(start+1, nums, target - nums[start]);
        }
    
        else return (groupSum6(start+1, nums, target - nums[start])) || (groupSum6(start+1, nums, target)) ;
    
    }
    

    【讨论】:

    • 感谢您的回复。为错误道歉,我的意思是说“开始”而不是 nums[start]。
    • 一个问题:使用start++和start+1有区别吗?
    • 你不应该道歉,我们是人类,我们正在犯错误。这很正常。
    • a++ 使用然后递增变量.. ++a 递增然后使用变量,但是 ++a 在这里也不合适,为什么?当您使用 (a+1) 调用方法时,您不会更改值 a in
    • 当您使用 (a+1) 递归调用方法时,您不会更改当前递归级别中的值 a,但在下一级递归中,值 a 将增加 1(即 a =一+1)
    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 2015-05-06
    • 1970-01-01
    • 2015-03-24
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多