-
189-A, *1300코드포스 2021. 7. 27. 21:20
Problem - 189A - Codeforces
codeforces.com
문제
- 세 정수 a, b, c(1≤a, b, c≤4000)가 주어진다
- 길이가 n(1≤n≤4000)인 끈을 길이 a, b, c로만 자를 때 나오는 조각의 최대 개수는?
O(n)
DPi를 길이가 i인 끈을 길이 a, b, c로만 자를 때 나오는 조각의 최대 개수라고 하자. 그러면
DPi=max(DPi−a, DPi−b, DPi−c)+1, Not all of DPi−a, Dpi−b, Dpi−c=01234567891011121314151617181920212223242526272829303132333435363738#include <bits/stdc++.h>#define endl "\n"using namespace std;int n, a, b, c;int dp[40001] {};int Maxval(int a, int b, int c){int maxval = a;if(maxval < b) maxval = b;if(maxval < c) maxval = c;return maxval;}int Dp(int ind){if(ind >= 0) return dp[ind];else return 0;}int main(){ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> a >> b >> c;dp[a] = 1;dp[b] = 1;dp[c] = 1;for(int i = 1; i <= n; i++) {if(Dp(i-a) or Dp(i-b) or Dp(i-c)) dp[i] = Maxval(Dp(i-a), Dp(i-b), Dp(i-c)) + 1;}cout << dp[n] << endl;return 0;}csO(n2)
ax+by+cz=n, (1≤x, y, z≤n)
을 만족하는 x+y+z의 최대값을 찾으면 된다
cz=n−ax−by
식을 위와 같이 정리하고 가능한 모든 x, y에 대해 z가 음이아닌 정수인지 판단한다
z가 음이 아닌 정수인 모든 경우에 대해 x+y+z의 최대값을 구한다123456789101112131415161718192021222324252627#include <bits/stdc++.h>#define endl "\n"using namespace std;int main(){ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int n, a, b, c;cin >> n >> a >> b >> c;int cz;int maxval = 0;for(int x = 0; x <= 4000; x++){for(int y = 0; y <= 4000; y++){cz = n - a*x - b*y;if(cz >= 0 && cz%c == 0){maxval = max(maxval, x+y+cz/c);}}}cout << maxval << endl;return 0;}cs'코드포스' 카테고리의 다른 글
459-B, *1300 (0) 2021.07.28 451-B, *1300 (0) 2021.07.28 230-B, *1300 (0) 2021.07.27 4-C, *1300 (0) 2021.07.25 1360-C, *1100 (0) 2021.07.25