一道想用暴力搜索的题目,提交显示答案错误,求帮忙看看错在哪里?
一共有10个节点,选择一定数量的节点使得权值总和最大,输出最大权值和。输入:
第1行一个M,表示有M个顺序关系(保证不会有环)
接下来M行每行有两个数u,v,表示要想选择节点v必须先选择节点u。
第M+2行十个数,表示S1到S10,每个节点的权值。
最后M+3行一个K,表示选择节点的个数。
输出:
输出权值和的最大值。
我的代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
int M,u,v,K,visited[12],ans;
vector<int> root[12];
struct node{
int number;
int score;
}a[12];
void dfs(int x,int sum){
int i,j,flag;
if(x==K+1){
ans=max(ans,sum);
return;
}
for(i=1;i<=10;i++){
if(!visited[a[i].number]){
flag=0;
for(j=0;j<root[a[i].number].size();j++){
if(!visited[root[a[i].number][j]]){
flag=1;
break;
}
}
if(flag==0){
visited[a[i].number]=1;
dfs(x+1,sum+a[i].score);
visited[a[i].number]=0;
}
}
}
}
int main(void){
int i;
while(scanf("%d",&M)!=EOF){
for(i=0;i<=M;i++){
root[i].clear();
}
for(i=1;i<=M;i++){
scanf("%d %d",&u,&v);
root[v].push_back(u);
}
for(i=1;i<=10;i++){
scanf("%d",&a[i].score);
a[i].number=i;
}
scanf("%d",&K);
ans=-1;
memset(visited,0,sizeof(visited));
dfs(1,0);
printf("%d\n",ans);
}
return 0;
}
由于这道题数据很小(10个节点),所以想到了暴力搜索,但是提交后显示答案错误,求大佬帮忙看一下哪里有问题?
如果有更好的方法,也希望大佬们提出来。