牛牛的背包问题(2019校招)

题目链接:

https://www.nowcoder.com/practice/bf877f837467488692be703735db84e6?tpId=98&tqId=32831&tPage=1&rp=1&ru=%2Fta%2F2019test&qru=%2Fta%2F2019test%2Fquestion-ranking

题目描述

牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。
牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。

输入描述:

输入包括两行
第一行为两个正整数n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9),表示零食的数量和背包的容量。
第二行n个正整数v[i](0 <= v[i] <= 10^9),表示每袋零食的体积。

输出描述:

输出一个正整数, 表示牛牛一共有多少种零食放法。
示例1

输入

3 10
1 2 4

输出

8

说明

三种零食总体积小于10,于是每种零食有放入和不放入两种情况,一共有2*2*2 = 8种情况。

分析

 1 // 纯递归会超时, 判断下是否和小于等于w,如果小于等于直接输出2^n种放法
 2 
 3 #include <bits/stdc++.h>
 4 using namespace std;
 5 
 6 long long int v[50], w;
 7 int n, total = 0;
 8 
 9 void dfs(int i, long long int now_w)
10 {
11     if (now_w > w)
12         return;
13     else if (i == n)
14         total++;
15     else
16     {
17         dfs(i + 1, now_w + v[i]);
18         dfs(i + 1, now_w);
19     }
20 }
21 
22 int main()
23 {
24     long long int sum = 0;
25     cin >> n >> w;
26     for (int i = 0; i < n; i++)
27     {
28         cin >> v[i];
29         sum += v[i]; // 求和
30     }
31     if (sum <= w) // 和小于等于w
32         printf("%lld\n", (long long int)pow(2,n)); // math.h中pow()函数返回double,转为整型输出
33     else 
34     {
35         dfs(0, 0);
36         cout << total << endl;
37     }
38     return 0;
39 }

 



posted @ 2020-03-24 12:52  sqdtss  阅读(196)  评论(0编辑  收藏  举报