01背包 knapsack problem
第一行两个整数 N 和V,分别表示物品个数和背包体积。
后面的表示物品的体积和价值
求最多装的物品的价值? 恰好装满包的最大的价值,没有的话返回0?
f[i][j] 前 i 件物品, 背包容量 j 下的最优解
let first = await readline();
let [N, V] = first.split(" ").map(Number);
let weight = [];
let value = [];
let dp1 = [0];
let dp2 = [0];
while ((line = await readline())) {
let tokens = line.split(" ");
weight.push(+tokens[0]);
value.push(+tokens[1]);
}
for(let i = 0; i < V; i++){
dp1.push(0)
dp2.push(-Infinity)
}
for (let n = 0; n < N; n++) {
for (let v = V; v >= weight[n]; v--) {
dp1[v] = Math.max(dp1[v], dp1[v-weight[n]] + value[n])
dp2[v] = Math.max(dp2[v], dp2[v-weight[n]]+ value[n])
}
}
console.log(dp1[V]) // 求最大的价值
console.log(dp2[V] > 0 ? dp2[V] : 0) //
完全背包
你有一个背包,最多能容纳的体积是V。
现在有n种物品,每种物品有任意多个…
let first = await readline();
let [N, V] = first.split(" ").map(Number);
let weight = [];
let value = [];
let dp1 = [0];
let dp2 = [0];
while ((line = await readline())) {
let tokens = line.split(" ");
weight.push(+tokens[0]);
value.push(+tokens[1]);
}
for (let i = 0; i < V; i++) {
dp1.push(0);
dp2.push(-Infinity);
}
for (let n = 0; n < N; n++) {
for (let v = 1; v <= V; v++) {
if (v >= weight[n]) {
dp1[v] = Math.max(dp1[v], dp1[v - weight[n]] + value[n]);
dp2[v] = Math.max(dp2[v], dp2[v - weight[n]] + value[n]);
}
}
}
console.log(dp1[V]); // 求最大的价值
console.log(dp2[V] > 0 ? dp2[V] : 0); //
贪心算法VS 动态
1.贪心最快,但是不是最高效的
找零问题
解题步骤
- verify the inputs/problem 验证问题
- derive a verbal solution 得出口头的解决方案
- pseudo code 伪代码
- derive time complexity and improve your solution
简化问题的方法 ways of simplifying a problem
- 分解问题
- console.log 或者 breakpoints 来验证变量
- 利用变量(对象,数组) 不要担心空间复杂度.