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

原文链接

相关推荐
java1234_小锋2 小时前
Spring AI 2.0 开发Java Agent智能体 - Advisors —— 拦截器模式增强AI能力
java·人工智能·spring·ai·spring ai2.0
Komore3152 小时前
商户查询缓存
java·redis·缓存
智者知已应修善业2 小时前
【51单片机从奇数始再转偶数逐一点亮并循环】2023-9-8
c++·经验分享·笔记·算法·51单片机
ch.ju2 小时前
Java程序设计(第3版)第二章——函数的返回值
java
倔强的猴子(翻版)2 小时前
我用 Python 写了个排序库,一亿数据量下比 C 级 np.sort() 快 7 倍
人工智能·python·算法·阿里云·文心一言
郝学胜-神的一滴2 小时前
深入理解回归损失函数:MSE、L1 与 Smooth L1 的设计哲学
人工智能·python·程序人生·算法·机器学习·数据挖掘·回归
努力努力再努力wz2 小时前
【MySQL进阶系列】拒绝冗余SQL:带你透彻理解视图的底层逻辑
android·c语言·数据结构·数据库·c++·sql·mysql
iCxhust2 小时前
在 emu8086 中可以直接编译运行的完整汇编程序,演示数组的定义、遍历、求和、求最大值。
开发语言·前端·javascript·汇编·单片机·嵌入式硬件·算法
架构源启2 小时前
OpenClaw 只能命令行触发?自研企业微信实现发消息即执行
java·chrome·自动化·企业微信