https://vjudge.net/problem/Gym-100712G
题意:
给出n枚不同价值的硬币和一个总价S,现在要选择尽量多的硬币来大于等于S,要求是比如说现在选择的硬币的总和为sum,那么所选择的任何一个硬币x,sum-x都必须<S。
思路:
一开始是想排序然后优先选择小的...没想到最后是暴力枚举。
因为N很小,最大也就是10,每枚要么选,要么不选,二进制枚举。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<queue> 7 #include<cmath> 8 #include<map> 9 #include<stack> 10 using namespace std; 11 12 int a[15]; 13 14 int main() 15 { 16 //freopen("D:\\input.txt","r",stdin); 17 int T; 18 int n,s; 19 scanf("%d",&T); 20 while(T--) 21 { 22 scanf("%d%d",&n,&s); 23 for(int i=0;i<n;i++) 24 scanf("%d",&a[i]); 25 int ans=0; 26 for(int i=0;i<(1<<n);i++) 27 { 28 int MIN=2000; 29 int sum=0; 30 int num=0; 31 for(int j=0;j<n;j++) 32 { 33 if(i&(1<<j)) 34 { 35 num++; 36 sum+=a[j]; 37 MIN=min(MIN,a[j]); 38 } 39 } 40 if(sum>=s && sum-MIN<s) 41 ans=max(ans,num); 42 } 43 printf("%d\n",ans); 44 } 45 return 0; 46 }