洛谷题解:P16304 [蓝桥杯 2026 省 Java C 组] 抽奖活动

题意

给出 n n n 数,可以执行 k k k 次操作,每次从剩余的球里选一个,保证左边的数的数量是右边的倍数,求最大拿到的数的和。

思路

由于 n n n 很小,可以考虑压装。 d p x dp_x dpx 表示当前选择情况为 x x x 的最大权值。其中, x x x 的二进制位表示它对应的数是否被选择。

复杂度 O ( n 2 n ) \mathcal{O}(n2^n) O(n2n)。

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,k,a[21],dp[2000000],mx;
int main(){
	//读入
	cin>>n>>k,memset(dp,-1,sizeof dp),dp[0]=0;
	for(int i=1;i<=n;i++) cin>>a[i];
	//枚举x
	for(int x=0;x<=(1<<n)-1;mx=max(mx,dp[x]),x++)
		if(int co=__builtin_popcount(x);dp[x]!=-1&&co<k){
			//判断是否能继续扩展
			for(int i=1,l=0,r;i<=n;i++)//扩展
				if(!(x&(1<<(i-1)))){//这个数没有被选上
					r=n-co-l-1;//计算右边的数的个数
					//满足要求就更新最大值
					if(r&&!(l%r)) dp[x|(1<<(i-1))]=max(dp[x|(1<<(i-1))],dp[x]+a[i]);
					l++;//左边的数字增加
				}
		}
	cout<<mx;//输出最大值
	return 0;
}

原文链接

相关推荐
金銀銅鐵10 分钟前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
汉克老师1 小时前
CSP-J 2026 第二轮入门组真题解析(第一题 、旅游)
c++·csp-j·信息学竞赛·小学生学c++
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
文丑颜不良啊1 小时前
LeetCode1941~1960题目解析
java·leetcode
txxzjmzlh2 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj5204 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河664 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
老师我太想进步了20265 小时前
【数据结构-4】算法美学之顺序表
数据结构·算法
风影同志783245 小时前
编码器是激活函数吗?—— 一个看起来很像、其实不是的类比
算法
SL_staff5 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品