dfs作为暴力算法,有时候剪枝好了可以骗很多分,因此一定要多思考剪枝,注释够详细了吧QAQ~
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[21],nxt[21],lenth,sum;
bool vis[21];
int flag;
bool cmp(int x,int y) {
return x>y;
}
void dfs(int k,int last,int rest) {//k为拼到第几根,last为上次用的是第几根木棍,rest表示该木料剩余多少
int i;
if(!rest) {
if(k==4) {
flag=1;
return ;
}
for( i=1; i<=m; i++)
if(!vis[i])
break;
vis[i]=1;
dfs(k+1,i,lenth-a[i]);
vis[i]=0;
if(flag) return ;
}
int l=last+1,r=m,mid;//二分查找第一根比剩余短的木棍
while(l<r) {
mid=(l+r)/2;
if(a[mid]<=rest) r=mid;
else l=mid+1;
}
for( i=l; i<=m; i++) {
if(!vis[i]) {
vis[i]=1;