P1441 砝碼稱重 搜尋 01揹包

2022-05-18 05:49:43 字數 1790 閱讀 1381

現有n個砝碼,重量分別為 a_iai​,在去掉 mm 個砝碼後,問最多能稱量出多少不同的重量(不包括 00)。

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

第 11 行為有兩個整數 nn 和 mm,用空格分隔。

第 22 行有 nn 個正整數 a_1, a_2, a_3,\ldots , a_na1​,a2​,a3​,…,an​,表示每個砝碼的重量。

僅包括 11 個整數,為最多能稱量出的重量數量。

輸入 #1複製

3 1

1 2 2

輸出 #1複製

3

思路

搜尋出拋棄個數為m的所有組合,在dfs的過程中給不用的砝碼打上標記,然後利用01揹包的方式求解最大的不同數字的組合即可。

這題不加優化,穩妥一點從5000種列舉到0,跑了將近700ms,如果隨時記錄可用砝碼重量的最大值來優化這個過程,就像題解中那樣,只要跑100ms左右。

code

#include

<

bits/stdc++.h

>

#define

dbg(

x) cout <<

#x<<"=

"<< x << endl

#define

eps1e-

8#define

piacos(

-1.0

)using

namespace std;

typedef

long

long ll;

const

int inf =

0x3f3f3f3f

;template

<

class t>

inline

void

read(t &

res)

namespace _buff 

return ib == ie ?-1

:*ib++;}

}int

qread()

if(c =='-

')for(; c >='0

'&& c <='9

'; c =

getc())

return pos ? ret :

-ret;

}int n, m;

inta[50

];bool

vis[

50];

intf[50

];int maxx =0;

int maxn =0;

intcheck();f

[0]=

1;for(

int i =

1; i <= n;

++i )}}

for(

int i =

1; i <= maxx;

++i )

}return num;

}void

dfs(

intid

,int

sum)

if(sum == m +1)

for(

int i = id +

1; i <= n;

++i )

}int

main()

sort(a +

1, a + n +1);

dfs(0,

1);cout << maxn << endl;

return0;

}

P1441 砝碼稱重 搜尋 dp

你會發現 對於這種很像揹包的dp。不打滾動陣列很有可能錯,因為很多時候可能會忘記保留以前狀態的答案,體現在f i j max f i 1 j f i j 上,因為f i j 可能被f i b i 更新,所以要取max,若想不取max,則必須保證這個狀態只會被更新一次 這題刷錶比填表更好寫,刷表你的初...

洛谷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...