记录一下(AI刷题-动态规划)

55 阅读1分钟

关于徒步旅行中的补给问题有误的点,其中样例1的输出最佳值应该是8?

function fdr(data) {
    return data.reduce((prev, c,index) => {
        if(prev.isPass && (prev.count+c) < (index+1)) {
            prev.isPass = false;
        } else {
            prev.count += c;
        }
        return prev;
    }, {count:0,isPass: true}).isPass
};
function dr(data, l) {
    return data.map((items) => items.reduce((p, i,idx) => {
        p.count += i*l[idx];
        p.list.push(i);
        return p;
    },{count: 0, list: []}));
};
function findCombinations(n, k, data) {
  const list = [];
    const result = [];
  
  function backtrack(digits, index, sum) {
    // 如果已经到达最后一位数字,并且总和等于5,保存这个组合
    if (index === n) {
      if (sum === n) {
        list.push(digits.slice());
      }
      return;
    }
    
    // 尝试每一位的可能值:0, 1, 2
    for (let i = 0; i <= k; i++) {
      digits.push(i);
        if(fdr(digits)) {
          backtrack(digits, index + 1, sum + i);
        }
      digits.pop(); // 回溯,移除最后一位数字
    }
  }
  
  backtrack([], 0, 0); // 从第一位数字开始,总和为0
  return dr(list, data).sort((a,b) => a.count-b.count)[0];
}

console.log(findCombinations(5, 2,[1, 2, 3, 3, 2])); // 8,题目样例1中输出给的是 9
console.log(findCombinations(6, 3, [4, 1, 5, 2, 1, 3])); // 9
console.log(findCombinations(4, 1, [3, 2, 4, 1])); // 10