解法
良い感じにやる。dp[金額] = 買えるかどうか
dp[金額]がtrueで,素数である最大値を求めれば良い。
ソース
#include<cstdio>
bool dp[1000001];
bool isprime(int& x){
for(int i = 2 ; i * i <= x ; i++ ) if( x % i == 0) return true;
return x == 1;
}
int solve(int& i){
while(true){
if(dp[i] && !isprime(i)) return i;
i--;
}
}
int main(){
int n,x,data,ans;
dp[0] = true;
while(scanf("%d %d",&n,&x) , n){
for(int i = 1 ; i <= x ; i++ ) dp[i] = false;
for(int i = 0 ; i < n ; i++ ){
scanf("%d",&data);
for(int i = data ; i <= x ; i++ ) if(dp[i-data]) dp[i] = true;
}
if(ans = solve(x)) printf("%d\n",ans);
else printf("NA\n");
}
}
0 件のコメント:
コメントを投稿