http://www.bnuoj.com/bnuoj/problem_show.php?pid=29376
我直接暴力搜索的。
剪枝:
1、步骤最多只有4步,超过4步则退出
2、油的行程相加后的总和距离大于剩余距离时也退出
AC代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int yn; int a[1010]; bool cmp(int a, int b) { return a>b; } void Dfs(int sum, int now, int n,int nu,int i) { // printf("%d %d %d %d %d ",sum,now,n,nu,i); int t,next; if(yn == 1 || now > sum || nu > 4) { return ; } if(nu == 4 && now == sum) { yn = 1; return ; } for(t = i; t < n; t++) { next = now+a[t]; Dfs(sum,next,n,nu+1,t); } return ; } int main() { int t,i,l,x,n,sum; scanf("%d",&t); while(t--) { scanf("%d%d%d",&l,&x,&n); for(i = 0; i < n; i++) { scanf("%d",&a[i]); } sum = l-x; sort(a,a+n,cmp); if(sum > a[0]*4) { printf("No "); } else { yn = 0; for(i = 0; i < n; i++) { if(yn == 1) { break; } Dfs(sum,0,n,0,i); } if(yn) { printf("Yes "); } else { printf("No "); } } } return 0; }