Codevs 2144 砝碼稱重 2

2022-04-01 13:18:18 字數 1287 閱讀 4019

時間限制: 1 s

空間限制: 16000 kb

題目等級 : 鑽石 diamond

題解有n個砝碼,現在要稱乙個質量為m的物體,請問最少需要挑出幾個砝碼來稱?

注意乙個砝碼最多只能挑一次

輸入描述 input description

第一行兩個整數n和m,接下來n行每行乙個整數表示每個砝碼的重量。

輸出描述 output description

輸出選擇的砝碼的總數k,你的程式必須使得k盡量的小。

樣例輸入 sample input

3 1059

1樣例輸出 sample output

資料範圍及提示 data size & hint

1<=n<=30,1<=m<=2^31,1<=每個砝碼的質量<=2^30

#include#include

#include

#include

using

namespace

std;

#define maxn 31

int n,ans=0x7fffffff

;long

long

a[maxn],s[maxn],m;

bool cmp(int x,int y)

long

long

qread()

returni;}

void dfs(int pos,int cnt,long

long

sum)

if(cnt>=ans)return

;

if(pos>n)return

;

for(int i=pos;i<=n;i++)

}int

main()

100分 字尾和+剪枝

#include#include

#include

#include

using

namespace

std;

int ans(1000),w[50

],n;

long

long

mm;map

m;void dfs(int js,int last,int sum,bool

k)

else

for(int i=last;i)

dfs(js+1,i+1,sum+w[i],k);

}int

main()

100分 meet in the middle

codevs 2144 砝碼稱重 2(搜尋 剪枝)

codevs 2144 砝碼稱重 2 題目描述 description 有n個砝碼,現在要稱乙個質量為m的物體,請問最少需要挑出幾個砝碼來稱?注意乙個砝碼最多只能挑一次 輸入描述 input description 第一行兩個整數n和m,接下來n行每行乙個整數表示每個砝碼的重量。輸出描述 outpu...

刷題記錄 codevs2144 砝碼稱重 2

典型的折半列舉法 本質上是用空間換時間的思想,把一半的資料搜過之後用陣列儲存起來,搜另一半的時候就可以直接使用了 這樣就可以把時間複雜度由乘轉變為和 效率改善非常大哦 include include include include include include define maxn 35 usi...

2144 砝碼稱重 2

時間限制 1 s 空間限制 16000 kb 題目等級 鑽石 diamond 題解 description 有n個砝碼,現在要稱乙個質量為m的物體,請問最少需要挑出幾個砝碼來稱?注意乙個砝碼最多只能挑一次 輸入描述 input description 第一行兩個整數n和m,接下來n行每行乙個整數表示...