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

【01背包】P1466 [USACO2.2] 集合 Subset Sums

题目

P1466 [USACO2.2] 集合 Subset Sums
在这里插入图片描述

分析

感觉本题最难的难点就是想出用01背包做。特征:1~n的连续整数集合中挑选某些数。要求两个子集合的数字和是相等的,就相当于给定了限制条件在1~n中挑数字。

先分析状态表示,状态表示一般跟着题目要求什么来设置。本题要求划分方案数,那么我们的状态表示就设置成方案数。
f[i][j]:从前 i 个数中选出数值和为 j 的方案数
但是注意,题目要求的实际上是划分成两个子集合这样的方案有多少个,而我们的状态表示最终求的是有多少个数值和为sum/2的子集合,所以最后结果要除以2

状态转移方程:
方案数 = 不选 + 选
f[i][j] = f[i-1][j] + f[i-1][j-i]
代码实现上,如果写的是二维的状态转移方程,由于“选”是有条件限制的,所以“选”和“不选”是分开讨论的。
如果写成一维的,由于将条件省略进了循环中,就可以写在一起。

重要:当状态表示为方案数的时候,不要忘记初始化!!!

AC代码

#include<iostream>using namespace std;typedef long long LL; int n;LL f[40][800]; //f[i][j]:从前i个数中选出数值和为j的方案数 int main()
{cin >> n;int sum = (1 + n) * n / 2; //等差数列求和 if(sum % 2 == 1) //总和是奇数就凑不出来两堆数值相同的 {cout << 0;return 0;}sum /= 2; //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; //题目问的是可以分成多少对 return 0;
}
http://www.dtcms.com/a/283801.html

相关文章:

  • 华为云容器产品分析
  • HTML表格基础
  • 【Linux】第一个小程序—进度条
  • HikariCP数据库连接池高性能优化实战指南
  • Spring Boot 参数校验:@Valid 与 @Validated
  • 线上协同办公时代:以开源AI大模型等工具培养网感,拥抱职业变革
  • 【前沿技术动态】【AI总结】Spring Boot 4.0 预览版深度解析:云原生时代的新里程碑
  • Fair-code介绍(Fair code)(一套新型软件模型:旨在“开源”“商业可持续性”中找到平衡)
  • Spring Boot Jackson 序列化常用配置详解
  • redis速记
  • Jenkins Git Parameter 分支不显示前缀origin/或repo/
  • 【37】MFC入门到精通——MFC中 CString 数字字符串 转 WORD ( CString, WORD/int 互转)
  • 我爱学算法之—— 前缀和(下)
  • 破局 Meme 币永续:跨界融合 Ormer + AI + 舆情监控 的颠覆性框架
  • 日志采集——ZeroMQ的配置
  • MyBatis 之配置与映射核心要点解析
  • 林曦词典|文质彬彬
  • 如何查询pg账号权限 能否创建模式 删表建表
  • Vim多列打开不同文件操作指南
  • 什么是AI-AIGC-AGI-Agent?基本概念与区别的详细解析
  • 【SAP SD】跨公司销售、第三方销售、STO采购(公司间合同配件)
  • 【困难】题解力扣23:合并K个升序链表
  • 删除百度同步空间桌面图标
  • 面试高频题 力扣 200.岛屿数量 洪水灌溉 深度优先遍历 暴力搜索 C++解题思路 每日一题
  • 用Amazon Q Developer命令行工具(CLI)快捷开发酒店入住应用程序
  • 图片画廊浏览(侧重 CSS 网格布局和模态框交互)
  • onUnload页面卸载和onPageScroll监听页面滚动
  • EPLAN 电气制图(十): 绘制继电器控制回路从符号到属性设置(上)
  • C++编程学习(第九天)
  • FastAdmin系统框架通用操作平滑迁移到新服务器的详细步骤-优雅草卓伊凡