Вес последнего камня 2 в javascript, 1d массив

#javascript #algorithm #dynamic-programming

#javascript #алгоритм #динамическое программирование

Вопрос:

решение последнего камня весом 2 в cpp

Это позволяет пройти все тестовые случаи.

 class Solution {
   public:
   int lastStoneWeightII(vector<int>amp; stones) {
      int n = stones.size();
      int total = 0;
      for(int i = 0; i < n; i  ){
         total  = stones[i];
      }
      int req = total / 2;
      vector <bool> dp(req   1, false);
      dp[0] = true;
      int reach = 0;
      for(int i = 0; i < n; i  ){
         for(int j = req; j - stones[i] >= 0; j--){
            dp[j] = dp[j] || dp[j - stones[i]];
            if(dp[j]) reach = max(reach, j);
         }
      }
      return total - (2 * reach);
   }
};
  

Я попытался воспроизвести его в javascript и не смог передать
простые тестовые примеры, такие как [2,7,4,1,8,1]

Вот моя попытка

 var lastStoneWeightII = function(st) {
    // stone #
    const n = st.length;
    // sum up
    const sum = st.reduce((acc, curr) => {return acc curr});
    // e.g. half
    const ha = Math.floor(sum / 2);
    
    // half 1
    const dp = Array(ha 1).fill(false);
    // 1st ele = true
    dp[0] = true;
   
    // store tmp_max
    let max = 0;
    // loop element
    for(let i=0; i<n; i  ) {
        // single element
        const w = n[i];
        // backward, half
        for(let j=ha; j-w>=0; j--) {
            // update condi
            dp[j] = dp[j] || dp[j-w]; 
                
            // never comes in
            if(dp[j]) {
                //test
                console.log('     max', max, 'j', j)
                max = Math.max(max, j);
            }
        }
    }
    
    return (sum - max) - max;
}
  

Комментарии:

1. вы проверили, что вы написали? передавайте строку за строкой, и вы увидите разницу (удивлен, что const w = n[i]; компилируется, так как n это длина массива …)

2. В ссылке: So for example, if the input is like [2,7,4,1,8,1], then the output will be 1. This is because if we smash (2,4), then the new array will be [2,7,1,8,1], them smash (7,8), the new array will be [2,1,1,1], then smash (2,1), the array will be [1,1,1], after that smash (1,1), so only 1 will be there. неубедительно (нет определения порядка разбиения): если мы пойдем «по порядку», [2,7,4,1,8,1], (2,7)->(5)->[5,4,1,8,1], (5,4)->(1)->[1,1,8,1], (1,1)->()->[8,1], (8,1)->(7)->[7]-> там будет только 7…