• 1235


    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
    ");
     99         else printf("No
    ");
    100     }
    101     return 0;
    102 }
    油!油!you@
  • 相关阅读:
    【BZOJ3926】诸神眷顾的幻想乡 【广义后缀自动机】
    【BZOJ2780】Sevenk Love Oimaster【广义后缀自动机】
    【BZOJ3227】串【广义后缀自动机】
    【CodeForces
    【BZOJ3238】差异【后缀自动机+dp】
    【BZOJ4566】找相同字符【后缀自动机】
    【BZOJ3998】弦论 【后缀自动机】
    【poj1743】Musical Theme 【后缀自动机】
    【SPOJ
    【SPOJ
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5574524.html
Copyright © 2020-2023  润新知