您的位置:首页 > 其它

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: