题目描述 Description
有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个砝码来称?
注意一个砝码最多只能挑一次
输入描述 Input Description
第一行两个整数n和m,接下来n行每行一个整数表示每个砝码的重量。
输出描述 Output Description
输出选择的砝码的总数k,你的程序必须使得k尽量的小。
样例输入 Sample Input
3 10
5
9
1
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
1<=n<=30,1<=m<=2^31,1<=每个砝码的质量<=2^30
题解:
hash??
还是爆搜吧;
AC代码:
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int N=1000; #define ll long long ll n,m,w[N],sum[N]; int dfs(int i,ll s){ int min=0,k; ll t; for(int j=i;j>=0;j--){ if(s+sum[j]<m) break;//不能更小,剪枝 t=s+w[j]; if(t<m){ k=dfs(j-1,t); if(k!=0&&(min==0||min>k+1)) min=k+1;//取小 } else if(t==m) return 1;//搜到答案 } return min; } int main(){ cin>>n>>m; for(int i=0;i<n;i++) cin>>w[i]; sort(w,w+n); sum[0]=w[0]; for(int i=1;i<n;i++) sum[i]=sum[i-1]+w[i]; printf("%d",dfs(n-1,0)); }