Problem Description

Input

Output

Sample Input

3
3
1 1 1
5
1 1 2 2 3
10
1 2 3 4 5 6 7 8 9 10

Sample Output

7
15
127

Sample Explanation

题意:有 t 组数据,对于每组数据,给出 n 个数字,最多有 n 个玩具,其中每个数字有两种含义,要么是一个玩具的重量,要么是一个袋的重量,袋子的重量表示袋子中的玩具的重量,其重量为任意个玩具的重量之和,问最多有多少种方案

思路:

对于不超过 15 个数字的 n 个数字,每个数字有两种状态,即要么是表单个玩具重量,要么是表袋内部分玩具的总重,根据前面数字所代表的状态很容易判断后面数字代表的状态,满足无后效性原则,因此很容易想到可以用状压 DP 来解决。

但袋子中玩具的个数无法确定,因此无法用简单的 1、0 来表示是玩具还是袋子,但由于袋子的重量是由袋子中玩具的重量相加得来,因此可用 1 来表示考虑当前数字,0 表示不考虑当前数字,通过对数字的考虑来进行组合,从而判断袋子的重量是否合理,例如:101 表示考虑第 1、3 数字时的合法方案数,即第 1、3 个数字可以组成一个袋子,用 f[101] 即可表示组成袋子的方案数,再用 dp[i] 来表示合法方案数。

这样一来,就有 1<<n  种状态,考虑袋子 i 去枚举状态 j ,由于袋子 i 中的物品必定属于袋子,因此不能与状态 j 有冲突,故有 i&j=0,以此来进行状态转移,故有:dp[i|j]+=dp[j]*f[i]

Source Program

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-6
#define MOD 16007
#define INF 0x3f3f3f3f
#define N 16
#define LL long long
using namespace std;
int a[N];
int f[1<<N];//组成袋子的合法方案数
int dp[1<<N];//合法方案数
int weight[1<<N];//第i种状态的重量
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=0;i<(1<<n);i++){weight[i]=0;f[i]=0;dp[i]=0;}for(int i=1;i<=n;i++)//n位数字for(int j=1;j<(1<<n);j++)//2^n种状态if( 1<<(i-1) & j )//若第i位是1weight[j]+=a[i];//记录第j个状态的重量for(int i=1;i<=n;i++)//n位数字for(int j=1;j<(1<<n);j++)//2^n种状态if( 1<<(i-1) & j )//若第i位是1if(weight[j]-a[i]==a[i])//如果第j个状态的重量减去第i个物品的重量等于第i个物品的重量说明选择第j个状态是一个合法的袋子f[j]++;for(int i=1;i<(1<<n);i++){//包裹2^n种状态int k=(1<<n)-1-i;//与i相斥的状态for(int j=k;;j=(j-1)&k){//选物品的状态且其不能选为包裹dp[i|j]+=dp[j]*f[i];if(j==0)break;}}printf("%d\n",dp[(1<<n)-1]);}return 0;
}

Riddle(2018 CCPC (秦皇岛站) I 题)相关推荐

  1. 2018 CCPC秦皇岛站日记

    三题93名铜前,还可以 9/25 明天就要去秦皇岛了,感觉好,麻烦啊...这里就不激动了,因为要忙好多东西. 首先是我准备了几天的模板,因为第一次比赛的原因,所以我也是第一次准备这种比较正式的模板.除 ...

  2. MUV LUV EXTRA 2019CCPC秦皇岛站J题 KMP

    题目链接 题意:意思给你俩数一个字符串,然后让你对字符串小数点后边的字符串进行处理,找个一个循环节以及对应出现的长度, 然后用a*p-b*l算得到一个最大值 那肯定循环节就想到了KMP了,然后循环长度 ...

  3. Invoker 2019CCPC秦皇岛站I题 简单DP

    题目链接 每个技能有6中组合,上一个技能也有6种组合,所以从该状态6种分别从上种的6种转移过来取最小值即可. 不读题的话可能就看成两种状态了(hh ss表示当前状态,s[k]表示上个状态,check函 ...

  4. 2018 CCPC 桂林站小结

    第三次现场赛,金了 热身赛 4道题,我一上来就扑在概率上无法自拔,最终也没搞出来,写出一个自积分的函数无可奈何.狂WA不止的一道题,全队看了好几遍代码也不知道错在哪里,结束后发现隔壁AC该题的队伍留在 ...

  5. Gym 102028D Keiichi Tsuchiya the Drift King(2018 ICPC 焦作站 D 题) 计算几何

    去年暑假集训了两个月就去了焦作,这个题一直卡着到最后也没做出来,很遗憾的在人生中第一场 ICPC 比赛打了铁.当时也没有补题的习惯,这个题知道了大致做法后就放过了.今年准备银川赛区,翻出了往年的比赛真 ...

  6. 2018 ICPC焦作站 F题 Honeycomb【bfs】

    题目链接:https://codeforces.com/gym/102028/problem/F 这题就是输入处理比较恶心,先写个gets(mp[x]+1) 本地没问题,oj的编译器直接报错,真玄学, ...

  7. 2019年CCPC秦皇岛站部分题解

    前言 感觉这套题有点难度,相比之下博主是真的菜狗. 不过只要lm队长讲明白MUV LUV EXTRA,欢姐绝杀掉Forest Program ,我再去挨个折磨,就等于菜狗博主的大胜利! Decimal ...

  8. 2021-11-12 (2018 CCPC 吉林站)

    A - The Fool 题意: 给一个数n,你需要求出n/1+n/2+...+n/n的和,判断和为奇或偶,输出. 思路: 打表可以发现前三个数为奇数,五个为偶数,七个为奇数,九个为偶数,即公差为2的 ...

  9. ZOJ 3987 Numbers 2017CCPC秦皇岛站G题 大整数 二进制 贪心

    题目:https://cn.vjudge.net/problem/ZOJ-3987 题意:给出一个数n(不超过4000个十进制数字),将其分成m(不超过10的100次方)个数,要求这m个数的和等于n. ...

最新文章

  1. gitLab创建自己的私有库
  2. SQL SERVER 查看并结束某个进程
  3. 非常好用的模糊pid温度控制算法_反应罐高低温温度控制装置
  4. (DML触发器)如何正确理解触发器的deleted表和inserted表(转)
  5. CRT exCRT模板
  6. 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)
  7. java 动态创建实例_java – 有没有办法动态创建类(而不是实例)?
  8. ipython jupyter区别_ipython jupyter notebook中显示图像和数学公式实例
  9. python实例 87,88
  10. PCA主成分分析实战和可视化 | 附R代码和测试数据
  11. 将深度缓冲z值变换到相机坐标系
  12. 如何进行需求矩阵管理
  13. 周鸿祎在人民日报撰文,呼吁推行网络安全大战略
  14. Springer期刊参考文献格式如何用Latex生成
  15. Junit 4 的使用
  16. QPSK数字调制系统在AWGN信道下的BER仿真
  17. 一个小型VC项目的开发
  18. 关于使用Python——写模拟手机通讯录查询系统
  19. 获取股票历史数据(2)——数据保存/数据可视化
  20. 写给全球Web3er:“低碳时代”下的Web3,何去何从?

热门文章

  1. 「知识图谱」领域近期值得读的 6 篇顶会论文
  2. skywalking使用方法_基于SkyWalking的监控系统安装与使用教程 PDF 下载
  3. 10个人有9个答错,另外1个只对一半:数据库的锁,到底锁的是什么?
  4. 这 6 个开源工具 yyds
  5. 平均工资达 1.6 万元!2020 年一线城市程序员工资大曝光
  6. B程序员:讲述三年计算机学习辛酸史
  7. DevOps是微服务的秘方
  8. 字符串转换成json的三种方式
  9. Linux进程管理(第二版) --计划任务
  10. 大数据之旅--Hadoop的发展史