牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。
牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。
输入包括两行
第一行为两个正整数n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9),表示零食的数量和背包的容量。
第二行n个正整数v[i](0 <= v[i] <= 10^9),表示每袋零食的体积。
输出一个正整数, 表示牛牛一共有多少种零食放法。
3 10 1 2 4
8
三种零食总体积小于10,于是每种零食有放入和不放入两种情况,一共有2*2*2 = 8种情况。
//递归 const readline = require('readline') const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) let inArr = [] rl.on('line', line => { if(!line) return inArr.push(line.trim()) if(inArr.length === 2) { let n = +inArr[0].split(' ')[0]//零食的数量 let w = +inArr[0].split(' ')[1]//背包的容量 let snackArr = inArr[1].split(' ').map(item => +item) let snackSum = snackArr.reduce((acc, cur) => acc+cur,0) if(snackSum <= w) { console.log(2**n)//Math.pow(2,n) }else { console.log(f(n - 1,w)) } function f (i, restW) { if(restW <= 0) { return 0 } if(i === 0) { if(snackArr[i] > restW) { return 1 } else { return 2 } } return f(i-1, restW - snackArr[i]) + f(i-1, restW) } } })
let [n, w] = readline().split(' ').map(d=>+d) let snacks = readline().split(' ').map(d=>+d) let result = 0 let sum = snacks.reduce((p,d)=>p+d,0) if(sum <= w){ console.log(Math.pow(2, n)) }else{ snacks.sort() dfs(0, 0) console.log(result) } function dfs(total, i){ if(i >= n){ result++ return } if(total+snacks[i] > w){ // 拿不起 dfs(total, i+1) // 不拿这包零食 }else{ // 拿得起 dfs(total, i+1) // 不拿这包零食 dfs(total+snacks[i], i+1) // 拿这包零食 } }