dl们为啥这个代码是错的???
查看原帖
dl们为啥这个代码是错的???
657442
wusihao1931楼主2022/7/31 12:08
#include <bits/stdc++.h>

using namespace std;

const int N = 21, M = 1 << N;

int n;
int ans;
int w[N], k;
int lefts[M], cnt;

void dfs1(int u, int sum)
{
    if (u == k )
    {
    	if (sum == 0) return ;
        lefts[cnt ++ ] = sum;
        return ;
    }
    
    dfs1(u + 1, sum + w[u]);
    dfs1(u + 1, sum - w[u]);
    dfs1(u + 1, sum);
}

void dfs2(int u, int sum)
{
    if (u == n)
    {
    	if (sum == 0) return ;
        int l = 0, r = cnt - 1;
        while (l < r)
        {
            int mid = l + r + 1 >> 1;
            if (lefts[mid] <= sum) l = mid;
            else r = mid - 1;
        }
        
        if (lefts[r] == sum)
		{
			ans ++ ;
		} 
        
        return ;
    }
    
    dfs2(u + 1, sum + w[u]);
    dfs2(u + 1, sum - w[u]);
    dfs2(u + 1, sum);
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ ) scanf("%d", &w[i]);
    
    k = n / 2;

    dfs1(0, 0);
    
    sort(lefts, lefts + cnt);
    cnt = unique(lefts, lefts + cnt) - lefts;
    
    dfs2(k, 0);
    
    cout << ans << endl;
    
    return 0;
}

2022/7/31 12:08
加载中...