반응형
문제출처
https://www.acmicpc.net/problem/3908
문제풀이
소스코드 참고
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <iostream> #include <vector> #include <cstring> #include <cmath> #include <algorithm> #define MAX 1120 using namespace std; bool isPrime[MAX+1]; vector<int> prime; int dp[MAX+1][15]; // 에라스토테네스의 체를 사용하여 MAX까지의 소수를 모두 구한다. void eratosthenes() { memset(isPrime, 1, sizeof(isPrime)); isPrime[0]=isPrime[1]=0; int sqrtn=int(sqrt(MAX)); for(int i=2; i<=sqrtn; i++) { if(isPrime[i]) { for(int j=i*i; j<=MAX; j+=i) { isPrime[j]=0; } } } for(int i=2; i<=MAX; i++) { if(isPrime[i]) prime.push_back(i); } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); eratosthenes(); dp[0][0]=1; // dp[n][k] = n을 k개의 소수의 합으로 만들수 있는 갯수 // 즉 n을 k개로 만드는 것의 합은 dp[n-prime[i]][k-1]의 합과 같다. for(int i=0; i<prime.size(); i++) { for(int j=MAX; j>=prime[i]; j--) { for(int k=1; k<15; k++) { dp[j][k]+=dp[j-prime[i]][k-1]; } } } int tc,n,k; cin>>tc; while(tc--) { cin>>n>>k; cout<<dp[n][k]<<endl; } return 0; } | cs |
반응형
'Algorithm' 카테고리의 다른 글
[BOJ 11718] 그대로 출력하기 (0) | 2019.04.15 |
---|---|
[SWEA 1244] 최대 상금 (4) | 2019.02.27 |
[BOJ 2407] 조합 (0) | 2019.02.26 |
[BOJ 10974] 모든 순열 (0) | 2019.02.25 |
[BOJ 9996] 한국이 그리울 땐 서버에 접속하지 (0) | 2019.02.22 |