题目链接: 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 ", sum); 38 if (a_sum <= W) 39 { 40 printf("%lld ", (1LL<<n)); 41 return 0; 42 } 43 dfs(-1, 0); 44 printf("%lld ", ans); 45 return 0; 46 }