1235 - Coin Change (IV)
Posted SJY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 |
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)的主要内容,如果未能解决你的问题,请参考以下文章