1 条题解

  • 0
    @ 2026-4-6 21:33:06
    这个题必须是折半二进制查找吗
    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
    上传者