現有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 11 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...