当前位置: 首页 > article >正文

蓝桥杯备考:特殊01背包问题——》集合subset

我们划分成两个集合,实际上我们只需要看一部分就行了,也就是从集合的所有元素里挑出恰好满足集合总和的一半儿,当然,如果我们的集合总和是奇数的话,我们是无论如何也挑不出刚好一半儿的,因为我们没有小数,然后这道题就变成了01背包问题,我们要从集合的所有元素里挑出恰好等于sum/2的所有搭配 由于我们选的是有重复的,最后结果要除2

我们按步骤做

step1 确定状态表达 f[i][j]表示从1到i的数里挑选出恰好等于j的搭配方案

step2 推导状态转移方程

step3:初始化,我们只需要初始第一列为1就行了

step4:答案就是f[n][sum/2] /2

 

#include <iostream>
using namespace std;
const int N = 40,M = 1000;
typedef long long ll;
ll f[N][N];

int main()
{
	int n;cin >> n;
	int sum  = ((1+n)*n)/2;
	if(sum&1){
		cout << 0 << endl;
		return 0;
	}
	sum/=2;
	f[0][0] = 1;
	for(int i = 1;i<=n;i++)
	{
		for(int j = 0;j<=sum;j++)
		{
			f[i][j] = f[i-1][j];
			if(j>=i) f[i][j]+=f[i-1][j-i];
		}
	}
	cout << f[n][sum]/2 << endl;
	
	
	
	
	
	return 0;
}


http://www.kler.cn/a/590896.html

相关文章:

  • c++图论(二)之图的存储图解
  • wx142基于django+vue+uniapp的摄影竞赛小程序
  • leetcode-47.全排列II
  • 迷你主机与普通台式电脑区别
  • 【conda activate无效】 conda: error: argument COMMAND: invalid choice: ‘activate‘
  • H-ZERO自定义全局字体 支持项目个性化字体需求
  • 【蓝桥杯速成】| 6.背包问题(01版)
  • C++11 详解版本1.0
  • Python 生成数据(绘制简单的折线图)
  • Redis和MongoDB的区别
  • POJ2301——Beat the Spread!、POJ3624——Charm Bracelet(0-1背包)、POJ2479——Maximum sum
  • 青少年编程与数学 02-011 MySQL数据库应用 04课题、数据库对象
  • 人工智能领域大模型、大模型使用、AI工作流 学习路径
  • 项目实战:基于瑞萨RA6M5构建多节点OTA升级-创建系统最小框架<三>
  • RuoYi-Vue路由,Node
  • 数据库管理-第303期 数据库相关硬件文章汇总(20250319)
  • 详细分析字体选择对话框代码
  • 邀请媒体参会邀约的好处?
  • 解决 开发FFMPEG视频播放器右侧白色线问题
  • js,html,css,vuejs手搓级联单选