洛谷 P1441 砝碼稱重 子集列舉 bitset

2021-09-27 18:42:07 字數 1356 閱讀 3777

題目描述

現有n個砝碼,重量分別為a1,a2,a3,……,an,在去掉m個砝碼後,問最多能稱量出多少不同的重量(不包括0)。

請注意,砝碼只能放在其中一邊。

輸入格式

輸入檔案weight.in的第1行為有兩個整數n和m,用空格分隔

第2行有n個正整數a1,a2,a3,……,an,表示每個砝碼的重量。

輸出格式

輸出檔案weight.out僅包括1個整數,為最多能稱量出的重量數量。

輸入輸出樣例

輸入 #1

複製3 1

1 2 2

輸出 #1複製3

思路:列舉[0,

2n−1

][0,2^-1]

[0,2n−

1]共2 n2^

2n種狀態,若某個狀態的二進位制表示含有n−m

n-mn−

m個11

1,那麼它二進位制為1

11的位就是我們要選取的砝碼的標號,利用bit

se

tbitset

bitset

來計算答案,bit

set[

i]=1

bitset[i]=1

bitset

[i]=

1表示用這些砝碼可以表示出重量i

ii,初始化需要令bit

set[

0]=1

bitset[0]=1

bitset

[0]=

1,那麼對於選取的砝碼a[j

]a[j]

a[j]

,只需要令:bit

set=

bits

et∣(

bits

et

<

j]

)bitset=bitset|(bitsettset

=bit

set∣

(bit

set<

j]),那麼bit

se

tbitset

bitset

中1

11的個數就是能表示出來的重量(答案要減去1

11 因為0

00不算在內)。

#include

using

namespace std;

typedef

long

long ll;

int n,m;

int a[25]

;int

main()

}printf

("%d\n"

,ans-1)

;return0;

}

洛谷P1441 砝碼稱重

現有n個砝碼,重量分別為 aia iai 在去掉 mmm 個砝碼後,問最多能稱量出多少不同的重量 不包括 000 請注意,砝碼只能放在其中一邊。第 111 行為有兩個整數 nnn 和 mmm,用空格分隔。第 222 行有 nnn 個正整數 a1,a2,a3,ana 1,a 2,a 3,ldots a...

洛谷 P1441 砝碼稱重(深搜 DP)

傳送門 題目描述 現有n個砝碼,重量分別為a1,a2,a3,an,在去掉m個砝碼後,問最多能稱量出多少不同的重量 不包括0 輸入輸出格式 輸入格式 輸入檔案weight.in的第1行為有兩個整數n和m,用空格分隔 第2行有n個正整數a1,a2,a3,an,表示每個砝碼的重量。輸出格式 輸出檔案wei...

洛谷 P1441 砝碼稱重(DFS回溯 DP)

題目大意 已知有n個砝碼,我們從中可以任意去掉m個,問我們最多可以得到多少種不同的重量。解題思路 首先,我們把解題分為兩個思路 首先,我們看任意去掉m個。這個我們可以用dfs模擬,關鍵在於停止條件。我們知道我們每一步都可以選擇新增或者不新增某個砝碼,然後重複n次。這樣我們就有最簡單的遞迴停止條件,遞...