深搜。不过有一个强大的剪枝。就是假设之后的全部用上都不能达到H,则return。
if (A[n]-A[x-1]+summ< H) return; //A[n]表示前nx项和
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 50; long long a[maxn], A[maxn]; int flag, n; long long H; void DFS(long long summ, int x) { if (summ == H) { flag = 1; return; } if (x > n) return; if (summ > H) return; if (A[n] - A[x - 1] + summ< H) return; DFS(summ + a[x], x + 1); if (flag == 1) return; DFS(summ, x + 1); if (flag == 1) return; } int main() { int i; while (~scanf("%d%lld", &n, &H)) { flag = 0; memset(A, 0, sizeof(A)); for (i = 1; i <= n; i++) { scanf("%lld", &a[i]); A[i] = A[i - 1] + a[i]; } DFS(0, 1); if (flag) printf("Yes\n"); else printf("No\n"); } return 0; }
时间: 2024-10-26 18:19:25