洛谷题解: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;
}

原文链接

相关推荐
wzdark2 小时前
基于堆的优先队列实现原理与复杂度分析4
算法
IT_Octopus4 小时前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea
老王熬夜敲代码4 小时前
BLAKE3:最快的密码学哈希函数
算法·密码学·哈希算法
hansang_IR4 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
见闻小天地5 小时前
简博斯JG-C系列彩色激光同轴位移计:摄像头模组对位与行程测量的技术价值观察
人工智能·算法
长征coder5 小时前
【无标题】
java·性能优化
ChampaignWolf5 小时前
在 SAP S/4HANA 内部基于 ICF Handler 从零实现 ABAP MCP Server:架构、代码与踩坑实录
c++·架构·sap·abap·mcp
新时代牛马5 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
葫三生5 小时前
《论三生原理》神话学构想与“神话历史”理论、《古史中的神话》思路异同?
大数据·人工智能·科技·深度学习·算法
Bs_MoneyMagnet6 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring