https://www.acmicpc.net/problem/3908
풀이: 소수를 찾는다. 소수를 하나씩 추가해가면서 a[n][k]를 찾는다. a[n][k] : 양의 정수 n을 서로 다른 k개의 소수의 합으로 나타낼 수 있는 최대의 경우의 수 코드: 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 #include <iostream>#include <vector>#include <math.h>#include <string.h>using namespace std; int T, n, k, a[1122][16] = { 0 }; bool isprime[1122]; vector<int> b; int prime() { memset(isprime, 1, sizeof(isprime)); isprime[0] = isprime[1] = false; for (int i = 2; i < sqrt(1122); i++) if(isprime[i]) for (int t = i * i; t < 1122; t += i) isprime[t] = false; for (int i = 2; i < 1122; i++) if (isprime[i]) b.
https://www.acmicpc.net/problem/7579
풀이: 처음 문제를 풀때는 DP[메모리]로 풀었더니 시간초과가 났다. 그래서 DP[c]로 풀게되었다. 가격이 0이고 메모리가 0인 지점부터 하나하나 더해가면서 만들어나간다. 그 후 가격이 낮은 곳부터 검사하면서 메모리가 M값보다 높아지면 출력한다. iter = a.end(); 를 처음에 iter = a.begin(); 으로 했을 때 출력이 잘못되는 것을 발견하였다. 아마 작은 값부터 더해가는 과정에 겹치는 값이 생겼을 것이라고 본다. 코드: 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 #include <iostream>#include <map>#include <algorithm>using namespace std; map<int, int> a; int k[101], c[101]; int main(void) { int n, m, size, temp; cin >> n >> m; a[0] = 0; for (int i = 0; i < n; i++) cin >> k[i]; for (int i = 0; i < n; i++) cin >> c[i]; map<int, int>::iterator iter; for (int i = 0; i < n; i++) { size = a.