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

原文链接

相关推荐
麻瓜生活睁不开眼2 小时前
Android16修改全局桌面视图边框四直角显示为弧边圆角
android·java·深度学习
dear_bi_MyOnly2 小时前
【MyBatis 操作数据库】
java·数据库·学习·mybatis·学习方法
2601_953720822 小时前
【计算机毕业设计】基于Spring Boot的心理健康咨询与评测系统的设计与实现
java·spring boot·后端
丈剑走天涯3 小时前
JDK 17 正式特性
java·开发语言
圣光SG3 小时前
Java操作题练习(七)
java·开发语言·算法
Cx330_FCQ5 小时前
Tmux使用
服务器·git·算法
@航空母舰5 小时前
SpringBoot通过Map实现天然的策略模式
java·spring boot·后端
Co_Hui6 小时前
Java 并发编程
java
拳里剑气6 小时前
C++算法:多源BFS
c++·算法·宽度优先·多源bfs
ysa0510307 小时前
【板子】短序列dp(换成维护更小常数维度的dp)
c++·笔记·算法·板子