【中等】AcWing3417. ——砝码称重

见:https://www.acwing.com/problem/content/3420/

你有一架天平和 NN 个砝码,这 NN 个砝码重量依次是 W1,W2,⋅⋅⋅,WNW1,W2,···,WN。

请你计算一共可以称出多少种不同的正整数重量?

注意砝码可以放在天平两边。

输入格式

输入的第一行包含一个整数 NN。

第二行包含 NN 个整数:W1,W2,W3,⋅⋅⋅,WNW1,W2,W3,···,WN。

输出格式

输出一个整数代表答案。

数据范围

对于 50%50% 的评测用例,1≤N≤151≤N≤15。
对于所有评测用例,1≤N≤1001≤N≤100,NN 个砝码总重不超过 105105。

输入样例:
3
1 4 6
输出样例:
​10
样例解释

能称出的 1010 种重量是:1、2、3、4、5、6、7、9、10、111、2、3、4、5、6、7、9、10、11。

1 = 1;
2 = 6 − 4 (天平一边放 6,另一边放 4);
3 = 4 − 1;
4 = 4;
5 = 6 − 1;
6 = 6;
7 = 1 + 6;
9 = 4 + 6 − 1;
10 = 4 + 6;
11 = 1 + 4 + 6。
​
难度:中等
时/空限制:1s / 256MB
总通过数:12582
总尝试数:28170
来源:

第十二届蓝桥杯省赛第一场C++ A组/B组/研究生组

算法标签

用bitse耶

首先bitset这个数据结构
C Bitsets
C Bitsets给程序员提供一种位集合的数据结构。Bitsets使用许多二元操作符,比如逻辑和,或等。

Constructors 创建新bitsets
Operators 比较和赋值bitsets
any() 如果有任何一个位被设置就返回true
count() 返回被设置的位的个数
flip() 反转bits中的位
none() 如果没有位被设置则返回true
reset() 清空所有位
set() 设置位
size() 返回可以容纳的位的个数
test() 返回指定位的状态
to_string() 返回bitset的字符串表示
to_ulong() 返回bitset的整数表示

一些解释
|能让状态不重
先<<再>>状态不漏
状态一定合法,

>>时不合法的状态都是<0(对应重物质量<0)的,

bitset不记录负的。
<<| 只放一边,

>>|更新出重物边放砝码的所有状态
>>| 将一些砝码放在另一边,

由于此时砝码边的所有状态都有了,

在右边放一个g[i],

不会出现大于g[i]的状态无法转移过来的,

有人可能会认为由于g[i]不是有序的,

这么干会让一些状态丢失,

实则不会这样,

因为所有状态的祖先都已经被更新出来,

就类似<<时的s[0] = 1,

顺序就无所谓了。

so

code

#include 
using namespace std;
 
const int maxn=1e2+5;
const int maxm=1e5+5;
int g[maxn];
bitset s;
int n;
 
int main() {
    cin>>n;
    for(int i=0; i>g[i];
 
    s[0]=1;
    for(int i=0; i>g[i];
    cout<

听说给点赞,关注,收藏的人会发财哦(づ ̄3 ̄)づ╭❤~

你可能感兴趣的:(信息学奥赛,C++,STL标准库,算法,数据结构)