https://www.acmicpc.net/problem/1943
1943번: 동전 분배
세 개의 입력이 주어진다. 각 입력의 첫째 줄에 동전의 종류 N(1 ≤ N ≤ 100)이 주어진다. 각 입력의 둘째 줄부터 N+1째 줄까지 각각의 동전의 금액과 개수가 빈 칸을 사이에 두고 주어진다. 단, 원
www.acmicpc.net
과정
- 입력을 받으면서 가능한 코인의 경우를 true로 바꿔줍니다.
- coins를 모두 돌며 sum/2부터 역순으로 진행합니다.
- 이전 idx를 기준으로 탐색을 진행하기 때문에 탑다운 방식으로 진행합니다.
- 정답 이하인 경우만 진행하면 됩니다.
코드
#include<iostream>
#include<vector>
using namespace std;
vector<pair<int, int> > coins;
bool dp[100001];
int N;
int sum;
void input(){
cin>>N;
coins.resize(N);
for(int i=0;i<N;++i){
cin>>coins[i].first>>coins[i].second;
sum += coins[i].first * coins[i].second;
for(int i=1;i<=coins[i].second;++i)
dp[i*coins[i].first] = true;
}
}
void solution(){
dp[0] = true;
if(sum % 2 == 1){
cout<<0<<'\n';
return ;
}
for(int i=0;i<coins.size();++i){
int value = coins[i].first;
int nums = coins[i].second;
for(int j=sum/2;j>=value;--j){
if(dp[j-value]){
for(int k=0;k<nums;++k){
if(j + value * k <= sum/2)
dp[j + value * k ] = true;
else
break;
}
}
}
}
cout<<dp[sum/2]<<'\n';
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T = 3;
while(T--){
sum = 0;
coins.clear();
fill(&dp[0], &dp[100001], false);
input();
solution();
}
return 0;
}

728x90
'알고리즘 > 백준 문제' 카테고리의 다른 글
| 2467 - 용액 (0) | 2023.08.02 |
|---|---|
| 5972 - 택배 배송 (0) | 2023.07.26 |
| 14719 - 빗물 (0) | 2023.07.25 |
| 20437 - 문자열 게임 2 (0) | 2023.07.24 |
| 17615 - 볼 모으기 (0) | 2023.07.23 |
댓글