본문 바로가기

Algorithm/Baekjoon BOJ

[백준][C++] 2629: 양팔저울

반응형

 

https://www.acmicpc.net/problem/2629

 

2629번: 양팔저울

첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은 무게의 추가 여러 개 있을 수도 있다. 추의 무

www.acmicpc.net

 

 

 

 

 


- 문제

 

  양팔저울과 n개의 추가 있고, 무게를 측정하고 싶은 m개의 구슬이 있을 때 추를 이용하여 구슬의 무게를 측정할 수 있는지 없는지 구하는 문제다.

 

 


- 해설

가방문제?와 비슷하게 풀 수 있을 것 같다.

 

결국 추 하나당 할 수 있는 행동은 3가지가 있다.

 

1. 추를 좌측 저울에 둔다.

 

2. 추를 두지 않는다.

 

3. 추를 우측 저울에 둔다.

 

 

위의 세 가지 행동을 모든 추가 한다면 그걸로 문제를 해결할 수 있다.

 

 

 

 


- 풀이

#include <iostream>
#include <vector>
using namespace std;

#define MAX 30


bool dp[MAX + 1][MAX * 500 + 1];
int weight, ball, temp;
vector<int> weights, balls;

void CheckWeights(int cnt, int result){
    if(cnt > weight){
        return;
    }
    if(dp[cnt][result] == true){
        return;
    }
    
    dp[cnt][result] = true;
    CheckWeights(cnt+1,result+weights[cnt]);
    CheckWeights(cnt+1,result);
    CheckWeights(cnt+1,abs(result-weights[cnt]));
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    cin >> weight;
    for(int i = 0; i < weight; i++){
        cin >> temp;
        weights.push_back(temp);
    }
    
    CheckWeights(0,0);
    
    cin >> ball;
    for(int i = 0; i < ball; i++){
        cin >> temp;
        balls.push_back(temp);
    }
    
    for(auto i : balls){
        if(i > MAX * 500){
            cout << "N ";
        }
        else if(dp[weight][i]){
            cout << "Y ";
        }
        else{
            cout << "N ";
        }
    }
    
    
    return 0;
}

 

 


- 새롭게 알게 된 점

 

반응형

'Algorithm > Baekjoon BOJ' 카테고리의 다른 글

[백준][C++] 17298: 오큰수  (0) 2022.12.30
[백준][C++] 9935: 문자열 폭탄  (1) 2022.12.30
[백준][C++] 1520: 내리막 길  (0) 2022.12.30
[백준][C++] 1063: 킹  (1) 2022.12.27
[백준][C++] 2293: 동전 1  (1) 2022.12.26