Riddle(2018 CCPC (秦皇岛站) I 题)

Problem Description

Riddle(2018 CCPC (秦皇岛站) I 题)_第1张图片

Input 

Riddle(2018 CCPC (秦皇岛站) I 题)_第2张图片

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

Riddle(2018 CCPC (秦皇岛站) I 题)_第3张图片

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

思路:

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

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

这样一来,就有 1<

Source Program

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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<

 

你可能感兴趣的:(动态规划——状压,DP,#,其它,OJ)