GYM 100712 G.Heavy Coins(枚举)
2017-03-13 17:06
381 查看
Description
n枚硬币,第i个价值是a[i],现在要从中拿出尽可能所的硬币去支付s元,钱多了没关系,但是要保证拿出的硬币去掉任何一个都无法支付成功,输出最多能用多少枚硬币
Input
第一行一整数T表示用例组数,每组用例输入两整数n和s表示硬币数量和要支付的数值,之后n个整数a[i]表示第i枚硬币的面值(1<=T<=1001,1<=n<=10,1<=s<=1000,1<=a[i]<=100)
Output
输出最多可以用掉多少枚硬币
Sample Input
Sample Output
3
6
Solution
2^n枚举,记录每个状态用的硬币总面值,最小值,数量,如果总面值不小于s且总面值减去最小值小于s说明该状态合法,拿所用数量更新答案即可
Code
n枚硬币,第i个价值是a[i],现在要从中拿出尽可能所的硬币去支付s元,钱多了没关系,但是要保证拿出的硬币去掉任何一个都无法支付成功,输出最多能用多少枚硬币
Input
第一行一整数T表示用例组数,每组用例输入两整数n和s表示硬币数量和要支付的数值,之后n个整数a[i]表示第i枚硬币的面值(1<=T<=1001,1<=n<=10,1<=s<=1000,1<=a[i]<=100)
Output
输出最多可以用掉多少枚硬币
Sample Input
Sample Output
3
6
Solution
2^n枚举,记录每个状态用的硬币总面值,最小值,数量,如果总面值不小于s且总面值减去最小值小于s说明该状态合法,拿所用数量更新答案即可
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f #define maxn 1111 int T,n,a[11],s; int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&s); for(int i=0;i<n;i++)scanf("%d",&a[i]); int N=1<<n,ans=0; for(int i=1;i<N;i++) { int b=1000,num=0,sum=0; for(int j=0;j<n;j++) if(i&(1<<j))num++,sum+=a[j],b=min(a[j],b); if(sum>=s&&sum-b<s)ans=max(ans,num); } printf("%d\n",ans); } return 0; }
相关文章推荐
- GYM 100712 I.Bahosain and Digits(枚举)
- Gym 100338I TV show (dfs枚举)
- codeforces gym 100712
- GYM 100712 E.Epic Professor(水~)
- GYM 100883 F.Print Mix Strings(枚举)
- Gym 100712E 贪心
- Codeforces Gym 100825 B. Delete This! (枚举 + 三分)
- Gym - 100543C Sums 等差数列枚举
- Gym 100712I Bahosain and Digits(枚举)
- Gym 101503C Twisting the Number(思维+枚举)
- GYM 100712 F.Travelling Salesman(最小生成树-Kruskal)
- Gym - 100712B 预处理暴力
- Gym-100712B-Rock-Paper-Scissors
- 【枚举约数】Gym - 101412A - Ginkgo Numbers
- GYM 100712 H.Bridges(边双连通分量)
- Gym 101138C Stickmen【枚举+排列组合】
- Gym-100712E-Epic Professor
- Gym 100712H(边双联通+树的直径)
- 【枚举】【高斯消元】Gym - 101412D - Find the Outlier
- GYM 101086 F.Hey JUDgE(枚举)