网易招聘笔试题--牛牛的背包问题

题目链接: https://www.nowcoder.com/question/next?pid=9763997&qid=152612&tid=14751374

解题思路: 题目中明确说了是背包问题,但这是个假象,看了题目中的数据范围,O(nm)的背包不可能通过。然后发现题目中n的范围特别小,n<=30。所以直接dfs了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 long long W;
 5 long long a[35];
 6 
 7 int n;
 8 
 9 long long ans = 0;
10 
11 void dfs(int t, long long sum)
12 {
13     ++ans;
14     if (t == n - 1)
15     {
16         return;
17     }
18     for (int i = t+1; i < n; ++i)
19     {
20         if (sum + a[i] <= W)
21         {
22             dfs(i, sum+a[i]);
23         }
24     }
25 }
26 
27 
28 int main()
29 {
30     scanf("%d%lld", &n, &W);
31     long long a_sum = 0LL;
32     for (int i = 0; i < n; ++i)
33     {
34         scanf("%lld", &a[i]);
35         a_sum += a[i];
36     }
37     // printf("%lld\n", sum);
38     if (a_sum <= W)
39     {
40         printf("%lld\n", (1LL<<n));
41         return 0;
42     }
43     dfs(-1, 0);
44     printf("%lld\n", ans);
45     return 0;
46 }

 

posted @ 2018-04-01 18:48  只会一点暴力  阅读(857)  评论(0编辑  收藏  举报