回溯算法缺少一个初始化语句导致错误?
题目:
是道acm题,简单描述一下。
题目链接 : http://acm.pku.edu.cn/JudgeOnline/problem?id=3413
一个Hero 有经验xp
然后遇到N个任务,完成这个任务的概率满足均匀分布,完成一个任务得到经验。
求一个任务的顺序,来得到完成所有任务的最高几率。
以下是代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <iomanip>
using namespace std;
double a[12],
b[12],
xp[12];
double best;
int Finish[12];
int n;
int Bestsort[12];
int tsort[12];
double glv(double aa,double bb,double xp){
if(xp<=aa) return 0.00;
else if(xp>=bb) return 1.00;
else return (xp-aa)/(bb-aa);
}
void Search(int ti,double db,double dxp,int count){
int j;
count++;
Finish[ti]=1;
tsort[count] = ti;
if(count == n && best < db*glv(a[ti],b[ti],dxp) ){
best = db*glv(a[ti],b[ti],dxp);
for(j=1;j<=n;j++)
Bestsort[j] = tsort[j];
return;
}
db = db*glv(a[ti],b[ti],dxp);
dxp = dxp + xp[ti];
for(j=1;j<=n;j++){
if(Finish[j] == 0 && db*glv(a[j],b[j],dxp) > best){
Search(j,db,dxp,count);
Finish[j]= 0;
}
}
}
void solve(double D){
int i;
best = 0.0;
for(i=1;i<=n;i++){
Finish[i] = 0;
Bestsort[i] = i;
}
for(i=1;i<=n;i++){
if(D>a[i]){
Search(i,1.00,D,0);
Finish[i] = 0;
}
}
printf("%.3f\n",best);
for(i=1;i<=n;i++) printf("%d ",Bestsort[i]);
printf("\n");
}
int main()
{
double D;
scanf("%d %lf",&n,&D);
int i;
for(i=1;i<=n;i++){
scanf("%lf %lf %lf",&a[i],&b[i],&xp[i]);
}
solve(D);
}
这个时候问题出现了 !
若加红的语句去掉,poj将判断程序错误。