1 条题解
-
0
这个题必须是折半二进制查找吗 deepseek答案 #include<bits/stdc++.h> using namespace std; #define int long long int n, x; vector<int> a; signed main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n >> x; a.resize(n); for (int i = 0; i < n; i++) cin >> a[i]; int mid = n / 2; int left_n = mid; int right_n = n - mid; // 左半部分枚举 unordered_map<int, int> left_sum_count; // 注意这里用 unordered_map,但 key 是 int64,需要自定义哈希或直接用 map // 用 map 更安全,虽然 O(log M) 但 2^20 次查询没问题 map<int, int> left_map; for (int mask = 0; mask < (1 << left_n); mask++) { int sum = 0; for (int j = 0; j < left_n; j++) { if ((mask >> j) & 1) { sum += a[j]; if (sum > x) break; // 小剪枝,但注意这里 break 只跳出内层循环,不会影响 mask 枚举 } } if (sum <= x) left_map[sum]++; } // 右半部分枚举并统计答案 int ans = 0; for (int mask = 0; mask < (1 << right_n); mask++) { int sum = 0; for (int j = 0; j < right_n; j++) { if ((mask >> j) & 1) { sum += a[mid + j]; if (sum > x) break; } } if (sum <= x) { ans += left_map[x - sum]; } } cout << ans << "\n"; 我的二进制枚举简单查找+中途剪枝不可以了 因为n太大了 #include<bits/stdc++.h> using namespace std; #define int long long /* n个数 任意选择 使得目标和严格等于x 本题n很大-要小剪枝-当当前累计量已经大于x没有必要再往后看了 -----所有更小问题的剪枝 */ const int N=50; int a[N]; int n,x; int ans; void solve() { for(int i=0;i<(1<<n);i++)//可全选可不选 { int sum=0; for(int j=0;j<n;j++) { if((i>>j)&1) sum+=a[j]; if(sum>x) break;//不看了 } if(sum==x) ans++; } return; } signed main() { std::ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>x; for(int i=0;i<n;i++) cin>>a[i]; solve(); cout<<ans<<"\n"; return 0; }
- 1
信息
- ID
- 834
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 204
- 已通过
- 27
- 上传者