任何人都可以像6岁那样向我解释解决方案吗?我还没有能够理解这些解决方案。也许有些代码评论?
谢谢。
我花了最后2个小时在coderbyte试图解决这个问题。这是个问题:
让函数ArrayAdditionI(arr)获取存储的数字数组 在arr中,如果中的任何数字组合,则返回字符串true 数组可以加到等于数组中的最大数字, 否则返回字符串false。例如:如果arr包含[4,6, 23,10,1,3]输出应该返回true,因为4 + 6 + 10 + 3 = 23.数组不会为空,不包含所有相同的元素,并且可能包含负数。
我已经浏览了互联网,通过人们对coderbyte本身的回答,阅读了一群人的解决方案,但没有任何评论,我真的很难弄清楚如何这个完成了。我已经无数次地开始了,所以我甚至不确定最后一次尝试是否更好。
我知道我需要以某种方式循环并测试每个组合索引5,索引4,索引3,索引2,索引1和每个组合少于所有这些(即只是索引5和指数3)。我无法弄清楚如何做到这一点。如果我知道列表总是一个包含5个数字的数组,并且它需要全部5个数字,那么我会编写5个循环,所有循环都同样嵌套在一个大数字中,对吧?然而,由于增加的复杂性不需要所有数字并且不知道所有情况下阵列的长度,我完全难过。我尝试使用Math.floor(Math.random()* array.length);生成一个数字列表......但这也没有用。
function ArrayAdditionI(arr) {
var longest = arr.sort( function(a,b) { return a-b });
var longest = longest[longest.length - 1];
var sumArr = function (arrb) {
var sum = 0;
for (var z = 0; z < arrb.length; z++){
sum += arrb[z];
}
return sum;
};
for (var i = 0; i > arr.length; i++) {
for (var y = 0; y > arr.length; i++) {
testArr.push(arr[i]);
if (sumArr(testArr) === longest) {
return true;
}
testArr.push(... its 4am and I'm stumped!...)
}}
// code goes here
return false;
}
// keep this function call here
// to see how to enter arguments in JavaScript scroll down
ArrayAdditionI(readline());
答案 0 :(得分:1)
这个问题的一个相当简单易懂和常见的解决方案如下。它基本上是通过添加每个后续数字(循环j)在数组(循环i)中向前循环开始的。如果循环j在没有解的情况下完成,则循环k开始并移除每个后续数字。然后我递增,循环重新开始。
function ArrayAdditionI(arr) {
arr.sort(function(a,b){return a - b})
var largest = arr.pop(); // Set largest to last (largest) array value
var sum = 0;
for (var i = 0; i < arr.length; i++){ // Start outer loop
sum += arr[i];
for (var j = 0; j < arr.length; j++){ // Start inner to begin sum
if (i != j) { // Ensure we don't add the same array index to itself
sum += arr[j];
console.log(sum);
if (sum == largest) {
return true;
}
}
}
for (var k = 0; k < arr.length; k++) { // If no match, start 2nd loop to re-iterate removing index values
if (i != k) {
sum -= arr[k];
console.log(sum);
if (sum == largest) {
return true;
}
}
}
sum = 0; // Reset sum for outer loop
}
return false;
}
答案 1 :(得分:0)
thefourtheye的评论基本上告诉了你问题的名称以及在google上搜索的内容。
java代码中的解决方案如下......
1)find all subsets that sum to a particular value
这是理论和伪代码。
2)How to implement the Sum of Subsets problem in Java
如果套数&gt;更改代码以返回您想要的内容。 0。
3)修改以下代码中的GetAllSubsetByStack,以便在找到集合时停止:
答案 2 :(得分:0)
我们对#34; MakeChange&#34;进行了类似的递归。在聚会的算法我去了昨晚。今天早上,我看了几个星期没看过它后,用新鲜的眼睛看了这个问题。这就是我想出来的。
基本上:将数组从最大到最小排序,将其关闭并声明它&#34; goal&#34;然后通过将数组切片越来越小来递归减少数组,当数组达到0长度时,随机化原始数组并再次开始减少。
如果目标=总计(即减少)则返回true 如果我已经将数组随机化超过1000次,则返回false。
function ArrayAdditionI(arr) {
var originalArr = arr.sort(function(a,b) {return b-a});
var goal = arr.shift();
var counter = 0;
function randomArray(array) {
for (var i = array.length - 1; i > 0; i -= 1){
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}
function recurse(arr) {
if (arr.length == 0){
counter++
var newArr = randomArray(originalArr);
return recurse(newArr);
} else {
var total = arr.reduce(function(a,b) {return a+b});
if (goal == total){
return true
} else if (counter == 1000) {
return false
} else {
newArr = arr.slice(1);
return recurse(newArr);
}
}
}
// code goes here
return recurse(originalArr);
}