记忆化搜索

只有INF那个点a了

#include<iostream>
#include<algorithm>
using namespace std;
bool mem[5][10010];//mem[1][?]表示有没有访问过,mem[2][?]记录能不能凑出来 
int cnt,n,a[114],gcd;
bool dfs(int n){
	if(n<0) return 0;//负数绝对不行 
	if(mem[1][n]) return mem[2][n];//访问过,return 
	mem[1][n]=1;//没有,访问 
	if(n==0) return mem[2][n]=1;//0个,可以 
	for(int i=1;i<=n;i++){
		if(dfs(n-a[i])) return mem[2][n]=1;//可以就return 
		else continue;//不行接着搜 
	}
	return mem[2][n]=0;//燃尽了,真不行 
}
int main(){
	cin>>n;
	cin>>a[1];
	gcd=a[1];
	for(int i=2;i<=n;i++){//判断inf 
		cin>>a[i];
		gcd=__gcd(a[i],gcd);
	}
	if(gcd!=1){
		cout<<"INF";
		return 0;
	}
	for(int i=1;i<=10000;i++){//搜 
		if(!dfs(i)) cnt++;
	}
	cout<<cnt;
	return 0;
}

1 comments

  • 1

Information

ID
5957
Time
1000ms
Memory
256MiB
Difficulty
3
Tags
# Submissions
191
Accepted
8
Uploaded By