Gym

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
",ans);
44     }
45     return 0;
46 }
原文地址:https://www.cnblogs.com/zyb993963526/p/6812836.html