分析
- 这个dp有点像走台阶,n个台阶,一次上去一个或两个,问你多少步。都从最后一步倒着考虑。
c++
#include<bits/stdc++.h>
using namespace std;
//Tools
#define ffor(i,s,e) for(int i=s;i<e;i++)
#define out(x) cout<<x<<" "
#define nl cout<<endl //nextline
//vars
int a[110];
int can[100010];
int n;
int minOdd=102;
//fun
void init();
int main(){
init();
if(minOdd==102){//只有偶数
puts("INF");
return 0;
}
int ans=0;
ffor(i,1,100010){
if(can[i]){
int con=minOdd;
while(can[i]){
con--;
if(con==0){//出现连续最小奇数个数字
cout<<ans<<endl;
return 0;
}
i++;
}
i--;
}else{
ans++;
}
}
cout<<"INF"<<endl;
return 0;
}
void init(){
cin>>n;
ffor(i,0,n){
int x;cin>>x;
can[x]=1;
if(x&1) minOdd=min(minOdd,x);
a[i]=x;
}
sort(a,a+n);
/*
ffor(i,1,12){
out(i);out(can[i]);
}
nl;
*/
ffor(i,a[0],100010){
if(can[i]) continue;
ffor(j,0,n){
if(i<a[j]) break;
if(can[i-a[j]]){
can[i]=1;
break;
}
}
}
}