前言 太对了哥,哥实在是太对
两道编程题都做出来了,过不过不要紧,开心是真的开心
虫子爬井
这题理清思路的话还是没啥问题的,就是如果爬上去的时候已经高过井的高度了,那么直接算爬出井了,不用再休息滑下来了。
(答题前看了看系统的支持情况,es6及es6以上都是不支持的,所以全部都用var
来定义)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 function fn (n, m ) { m = m * 100 ; var day = 0 ; var cur = 0 ; var down = 0 ; while (cur < m) { cur += n; day++; if (cur >= m) { return day; } down += n / Math .pow (2 , day); cur -= down; } return day; }
背包问题
这个其实我忘的差不多了,但是最后还是凭借着自己的理解做出来了,还是相当的开心的,虽然在别人眼里就是流水账一样的写…
背包问题就是填一个表格的问题,23333
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 function fn (n, p, items ) { var dp = []; for (var i = 0 ; i < items.length + 1 ; i++) { dp[i] = []; } for (var i = 0 ; i < items.length + 1 ; i++) { for (var j = 0 ; j < p + 1 ; j++) { dp[i][j] = 0 ; } } for (var i = 1 ; i < items.length + 1 ; i++) { for (var j = 1 ; j < p + 1 ; j++) { if (items[i - 1 ][1 ] <= j) { var c = parseInt (j / items[i - 1 ][1 ] + '' ); var len = Math .min (c, items[i - 1 ][0 ]); for (var l = 0 ; l <= len; l++) { dp[i][j] = Math .max (dp[i - 1 ][j - l * items[i - 1 ][1 ]] + l * items[i - 1 ][2 ], dp[i][j]); } } else { dp[i][j] = dp[i - 1 ][j]; } } } return dp[n][p]; }
这个代码还是可以进行空间上的优化的,使用一维数组来保存dp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function fn (n, p, items ) { var dp = []; for (var j = 0 ; j < p + 1 ; j++) { dp[j] = 0 ; } for (var i = 1 ; i < items.length + 1 ; i++) { for (var j = p; j >= 1 ; j--) { if (items[i - 1 ][1 ] <= j) { var c = parseInt (j / items[i - 1 ][1 ] + '' ); var len = Math .min (c, items[i - 1 ][0 ]); for (var l = 0 ; l <= len; l++) { dp[j] = Math .max (dp[j - l * items[i - 1 ][1 ]] + l * items[i - 1 ][2 ], dp[j]); } } } } return dp[p]; }
除了这种部分背包 问题,还有
背包问题基本都是一个解体的思路
01背包 01背包,也就是给出的东西,要么放进包里,要么不放进包里,
可以理解成部分背包每种物品只有一个的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 function fn2 (n, p, items ) { var dp = []; for (var i = 0 ; i < items.length + 1 ; i++) { dp[i] = []; } for (var i = 0 ; i < items.length + 1 ; i++) { for (var j = 0 ; j < p + 1 ; j++) { dp[i][j] = 0 ; } } for (var i = 1 ; i < items.length + 1 ; i++) { for (var j = 1 ; j < p + 1 ; j++) { if (items[i - 1 ][1 ] <= j) { dp[i][j] = Math .max (dp[i - 1 ][j - items[i - 1 ][1 ]] + items[i - 1 ][2 ], dp[i - 1 ][j]); } else { dp[i][j] = dp[i - 1 ][j]; } } } return dp[n][p]; }
完全背包 完全背包,也就是每件物品都不限制个数,只要总价值小于背包的价值
那么这件物品就可以无限放,就可以有更大的魅力值
可以理解成部分背包的物品有正无穷个的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 function fn (n, p, items ) { var dp = []; for (var i = 0 ; i < items.length + 1 ; i++) { dp[i] = []; } for (var i = 0 ; i < items.length + 1 ; i++) { for (var j = 0 ; j < p + 1 ; j++) { dp[i][j] = 0 ; } } for (var i = 1 ; i < items.length + 1 ; i++) { for (var j = 1 ; j < p + 1 ; j++) { if (items[i - 1 ][1 ] <= j) { var c = parseInt (j / items[i - 1 ][1 ] + '' ); for (var l = 0 ; l <= c; l++) { dp[i][j] = Math .max (dp[i - 1 ][j - l * items[i - 1 ][1 ]] + l * items[i - 1 ][2 ], dp[i][j]); } } else { dp[i][j] = dp[i - 1 ][j]; } } } return dp[n][p]; }
Tips:
因为使用京东的题目来写,所以这里的价值就类似容量,而魅力值就对应原来的价值
上面的输入物品的数组的格式都是
后记 如果过了感觉面试还是会gg,哈哈哈哈