Problem 1269 : Sum of Different Primes

Problem D: Sum of Different Primes
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1269

  • 問題概要

異なる素数を組み合わせて、その数が何通り作れますか?

  • 解法

メモ化探索?
大きい時にわからなければ小さい問題にわければいい!
みたいな感じ。
今どこまでの素数までつかったか、あとのこりいくつ素数がつかえるか、あと合計いくらにすればいいか。 を 
引数にして再帰

  • ソース
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<sstream>
#include<cassert>
#include<queue>
#include<stack>

#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define pb         push_back
#define mp         make_pair
#define vint       vector<int>
#define FOR(it,o)  for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it)
#define lli	    long long int
#define ld	    long double

#define N 1121
#define P 188
#define K 15

using namespace std;
bool t[N]; 
vector<int> p; 
int c[N][P][K];

int dp(int sum, int now, int num){
  if(sum == 0 && num == 0)return 1;
  if(num == 0)return 0;
  if(sum == 0)return 0;
  if(now == P)return 0; 
  if(c[sum][now][num] >= 0)return c[sum][now][num];
  int ans = 0;
  REP(i, now, P){
    if(p[i] > sum)break;
    ans += dp(sum-p[i], i+1, num-1);
  }
  c[sum][now][num] = ans;
  return ans;
}



main(){
  fill(t, t+N, true);
  rep(i, N){
    rep(j, P){
      rep(k, K){
	c[i][j][k] = -1;
      }
    }
  }
  t[0] = t[1] = false;
  rep(i, N){
    if(!t[i])continue;
    p.pb(i);
    for(int j=2; i*j < N; j++){
      t[i*j] = false;
    }
  }

  int n, k;
  while(cin >> n >> k){
    if(n+k == 0)break;
    
    cout << dp(n, 0, k) << endl;
  }
  
}