function knapsack(weights, values, W) {
    var n = weights.length;
    var dp = new Array(n).fill([]);
    for (var i = 0; i < n; i++) {
        for (var j = 0; j <= W; j++) {
            if (i > 0) {
                dp[i][j] = dp[i - 1][j];
                if (j >= dp[i]) {
                    var tmp = dp[i - 1][j - weights[i]] + values[i];
                    dp[i][j] = tmp > dp[i][j] ? tmp : dp[i][j];
                }
            } else {
                if (j >= weights[0]) { //处理第一行，其他都是基于第一行推导出来的
                    dp[0][j] = values[0];
                }
            }
        }
    }
    return dp[n][W]; //在目前背包情况下能装下的最大价值
}
