2024牛客寒假算法基础集训营1——H

2024牛客寒假算法基础集训营1——H_第1张图片
 

输入

3
4 11
1 8
1 4
1 5
1 1
4 11
5 8
1 4
1 5
1 1
4 0
2 0
0 0
3 0
4 1

输出

3
6
5

思路:

考虑二进制,有点像数位dp

本题考虑集合划分,累加最大值即可

2024牛客寒假算法基础集训营1——H_第2张图片

代码如下:

#include
using namespace std;

void solve()
{
	int n, m; cin >> n >> m;
	vectorv(n), w(n);
	for(int i = 0; i < n; i ++){
		cin >> v[i] >> w[i];
	}
	int ans = 0, pre = 0;
	for(int i = 31; i >= 0; i --){
		int x = pre;//置为前缀
		if((m >> i) & 1){
			x += (1 << i) - 1;//不选这一位是1,贪心出最大情况
			pre += (1 << i);//更新前缀
		}

		int sum = 0;
		for(int j = 0; j < n; j ++){
			if((x | w[j]) == x){
				sum += v[j];
			}
		}
		ans = max(ans, sum);
	}

    //补上x==m这种情况
	int sum = 0;
	for(int j = 0; j < n; j ++){
		if((m | w[j]) == m){
			sum += v[j];
		}
	}
	
	ans = max(ans, sum);

	cout << ans << endl;
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	//t = 1;
	cin >> t;
	while(t--)
	solve();
}

你可能感兴趣的:(DP,算法,c++,图论,贪心算法)