码迷,mamicode.com
首页 > 其他好文 > 详细

1235 - Coin Change (IV)

时间:2016-06-11 00:40:52      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:

1235 - Coin Change (IV)
Time Limit: 1 second(s) Memory Limit: 32 MB

Given n coins, values of them are A1, A2 ... An respectively, you have to find whether you can pay K using the coins. You can use any coin at most two times.

Input

Input starts with an integer T (≤ 100), denoting the number of test cases.

Each case starts with a line containing two integers n (1 ≤ n ≤ 18) and K (1 ≤ K ≤ 109). The next line contains n distinct integers denoting the values of the coins. These values will lie in the range [1, 107].

Output

For each case, print the case number and ‘Yes‘ if you can pay K using the coins, or ‘No‘ if it‘s not possible.

Sample Input

Output for Sample Input

3

2 5

1 2

2 10

1 2

3 10

1 3 5

Case 1: Yes

Case 2: No

Case 3: Yes

 


PROBLEM SETTER: JANE ALAM JAN
思路:折半枚举;
dfs+二分;
  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<string.h>
  5 #include<queue>
  6 #include<stdlib.h>
  7 #include<math.h>
  8 #include<stack>
  9 using namespace std;
 10 typedef long long LL;
 11 int ans[100];
 12 int ak[100000];
 13 int ac[100000];
 14 int N,M;
 15 int id1[100];
 16 int id2[100];
 17 void dfs(int n,int m,int sum)
 18 {
 19     if(n==m)
 20     {
 21         ak[N]=sum;
 22         N++;
 23         return ;
 24     }
 25     int i;
 26     for(i=0; i<=2; i++)
 27     {
 28         dfs(n+1,m,sum+id1[n]*i);
 29     }
 30 }
 31 void dfs1(int n,int m,int sum)
 32 {
 33     if(n==m)
 34     {
 35         ac[M]=sum;
 36         M++;
 37         return ;
 38     }
 39     int i;
 40     for(i=0; i<=2; i++)
 41     {
 42         dfs1(n+1,m,sum+id2[n]*i);
 43     }
 44 }
 45 int er(int n,int m,int ask)
 46 {
 47     int mid=(n+m)/2;
 48     if(n>m)
 49         return 0;
 50     if(ac[mid]==ask)
 51     {
 52         return 1;
 53     }
 54     else if(ac[mid]>ask)
 55     {
 56         return er(n,mid-1,ask);
 57     }
 58     else return er(mid+1,m,ask);
 59 
 60 }
 61 int main(void)
 62 {
 63     int i,j,k;
 64     scanf("%d",&k);
 65     int s;
 66     int n,m;
 67     for(s=1; s<=k; s++)
 68     {
 69         scanf("%d %d",&n,&m);
 70         for(i=0; i<n; i++)
 71         {
 72             scanf("%d",&ans[i]);
 73         }
 74         int cnt1=n/2;
 75         int cnt2=n-cnt1;
 76         for(i=0; i<cnt1; i++)
 77         {
 78             id1[i]=ans[i];
 79         }
 80         for(i=cnt1; i<n; i++)
 81         {
 82             id2[i-cnt1]=ans[i];
 83         }
 84         N=0;
 85         M=0;
 86         dfs(0,cnt1,0);
 87         dfs1(0,cnt2,0);
 88         sort(ac,ac+M);
 89         int flag=0;
 90         for(i=0; i<N; i++)
 91         {
 92             int ask=m-ak[i];
 93             flag=er(0,M-1,ask);
 94             if(flag)break;
 95         }
 96         printf("Case %d: ",s);
 97         if(flag)
 98             printf("Yes\n");
 99         else printf("No\n");
100     }
101     return 0;
102 }

 

1235 - Coin Change (IV)

标签:

原文地址:http://www.cnblogs.com/zzuli2sjy/p/5574524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!