dfs代码TLE两个点求调#2,#10
查看原帖
dfs代码TLE两个点求调#2,#10
1223528
Eraser2011楼主2025/2/7 12:30

回者必关!!!

rt,die码如下:

#include<bits/stdc++.h>
using namespace std;
// #define int unsigned long long
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
int v,neeed[30],g;
int a[30][30];
int vis[30];
int minn=INT_MAX;
bool ans[30];
bool pan(int x[]){
	for(int i=1;i<=v;i++){
		if(x[i]<neeed[i]){
			return false;	
		}
	}
	return true;
}
void dfs(int sum,bool vis[],int num[]){
	if(sum>=minn)return;
	if(sum<minn){
		if(pan(num)){
			minn=sum;
			for(int i=1;i<=g;i++)ans[i]=vis[i];
			return;
		}
	}
	for(int i=1;i<=g;i++){
		if(!vis[i]){
			vis[i]=1;
			for(int j=1;j<=v;j++)num[j]+=a[i][j];
			dfs(sum+1,vis,num);
			for(int j=1;j<=v;j++)num[j]-=a[i][j];
			vis[i]=0;
		}
	}
}
int main(){
	v=read();
	for(int i=1;i<=v;i++)neeed[i]=read();
	g=read();
	for(int i=1;i<=g;i++){
		for(int j=1;j<=v;j++){
			a[i][j]=read();
		}
	}
	bool tmp[30]={};
	int tmp2[30]={};
	dfs(0,tmp,tmp2);
	cout<<minn<<" ";
	for(int i=1;i<=g;i++)if(ans[i]==1)cout<<i<<" ";
	return 0;
}

求如何优化时间,最好在原代码上改,谢谢!

2025/2/7 12:30
加载中...