時間限制: 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#include100分 字尾和+剪枝#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()
#include#include100分 meet in the middle#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()
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行每行乙個整數表示...