https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1489
从解空间里面找到最小的
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
int val[20];
int n,a,b;
const int INF=0x3f3f3f3f;
int ans2=INF;
void dfs(int now,int cnt){
if(now==n){
ans2=min(ans2,cnt);
return;
}
if(val[now-1]<0){ //就是说如果当移动条件已经满足,我们可以直接走,当然,也可以不走
dfs(now+1,cnt);
}
int t1=0;
if(val[now-1]>=0){
t1=val[now-1]/b+1;
val[now-1]-=t1*b;
val[now] -=t1*a;
val[now+1]-=t1*b;
dfs(now+1,cnt+t1);
val[now-1]+=t1*b;
val[now] +=t1*a;
val[now+1]+=t1*b;
}
if(val[now]>=0){
int t2=val[now]/a+1;
if(t2>t1){
for(int i=t1+1;i<=t2;i++){
val[now-1]-=i*b;
val[now] -=i*a;
val[now+1]-=i*b;
dfs(now+1,cnt+i);
val[now-1]+=i*b;
val[now] +=i*a;
val[now+1]+=i*b;
}
}
}
}
int main(){
scanf("%d %d %d",&n,&a,&b);
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
int ans1=0;
while(val[1]>=0){
val[1]-=b;
val[2]-=a;
val[3]-=b;
ans1++;
}
if(n>3){
while(val[n]>=0){
val[n]-=b;
val[n-1]-=a;
val[n-2]-=b;
ans1++;
}
}
dfs(2,0);
if(ans2==INF)
ans2=0;
printf("%d\n",ans1+ans2);
return 0;
}