AOJ0202 At Boss's Expense

問題リンク At Boss's Expense

  • 解法

N個の料理の値段の和で表せる かつ 素数 かつ 予算以下という数字を見つければいいです。
予算の大きさの配列を用意し、値段xを料理の値段の和で表せるならばxのところにtrueを入れていくことで解けます。

  • ソース
import java.util.Arrays;
import java.util.Scanner;

//At Boss's Expense
public class AOJ0202 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		boolean[] prime = new boolean[1000001];
		Arrays.fill(prime, true);
		prime[1] = false;
		for(int i=2;i<1000001;i++){
			if(prime[i]){
				for(int j=i*2;j<1000001;j+=i)prime[j]=false;
			}
		}
		while(true){
			int n = sc.nextInt();
			int x = sc.nextInt();
			if((n|x)==0)break;
			int[] p = new int[n];
			boolean[] f = new boolean[x+1];
			f[0] = true;
			for(int i=0;i<n;i++){
				p[i]=sc.nextInt();
				for(int j=p[i];j<=x;j+=p[i])f[j]=true;
			}
			int max = 0;
			for(int i=1;i<=x;i++){
				if(!f[i]){
					for(int j=0;j<n;j++){
						if(i-p[j]>=0 && f[i-p[j]]){
							f[i] = true;
							break;
						}
					}
				}
				if(f[i] && prime[i])max = i;
			}
			System.out.println(max==0?"NA":max);
		}
	}
}