문제 링크: https://www.boj.kr/1182 

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2초 256MB 29396 13560 8585 44.296

문제

N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절대값은 100,000을 넘지 않는다.

출력

첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.

예제 입력 1

5 0
-7 -3 -2 5 8

예제 출력 1

1

C++ code

#include <stdio.h>
#include <vector>
using namespace std;

int n, s, ans;
vector<int> a;

void dfs(int idx, int sum)
{
	if (idx == n)
    {
    	if (sum == s)
        	ans++;
        return;
    }
    
    dfs (idx + 1, sum + a[idx]);
    dfs (idx + 1, sum);
}

int main (void)
{
	scanf("%d %d", &n, &s);
    
    for (int i = 0; i < n; i++)
    {
    	int temp;
        scanf("%d", &temp);
        a.push_back(temp);
    }
    
    dfs(0, 0);
    if (!s)
    	ans--;
    printf("%d", ans);
    return 0;
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

1162 - 도로포장  (0) 2020.11.07
1105 - 팔  (0) 2020.11.06
1081 - 합  (0) 2020.11.05
1074 - Z  (0) 2020.11.03
1059 - 수2  (0) 2020.11.02

문제 링크: https://www.boj.kr/1162 

 

1162번: 도로포장

첫 줄에는 도시의 수 N(1 ≤ N ≤ 10,000)과 도로의 수 M(1 ≤ M ≤ 50,000)과 포장할 도로의 수 K(1 ≤ K ≤ 20)가 공백으로 구분되어 주어진다. M개의 줄에 대해 도로를 연결짓는 두 도시와 도로를 통과하

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2초 128MB 5133 659 456 22.072%

문제

준영이는 매일 서울에서 포천까지 출퇴근을 한다. 하지만 잠이 많은 준영이는 늦잠을 자 포천에 늦게 도착하기 일쑤다. 돈이 많은 준영이는 고민 끝에 k개의 도로를 포장하여 서울에서 포천까지 가는 시간을 단축하려 한다.

문제는 N개의 도시가 주어지고 그 사이 도로와 이 도로릉 통과할 때 걸리는 시간이 주어졌을 때 최소 시간이 걸리도록 하는 K개의 이하의 도로를 포장하는 것이다. 도로는 이미 있는 도로만 포장할 수 있고, 포장하게 되면 도로를 지나는데 걸리는 시간이 0이 된다. 또한 편의상 서울은 반드시 1번 도시, 포천은 N번 도시라 하고 1번에서 N번까지 항상 갈 수 있는 데이터만 주어진다.

입력

첫 줄에는 도시의 수 N(1 ≤ N ≤ 10,000)과 도로의 수 M(1 ≤ M ≤ 50,000)과 포장할 도로의 수 K(1 ≤ K ≤ 20)가 공백으로 구분되어 주어진다. M개의 줄에 대해 도로를 연결짓는 두 도시와 도로를 통과하는데 걸리는 시간이 주어진다. 도로들은 양방향 도로이며, 걸리는 시간은 1,000,000보다 작거나 같은 자연수이다.

출력

첫 줄에 K개 이하의 도로를 포장하여 얻을 수 있는 최소 시간을 출력한다.

예제 입력 1

4 4 1
1 2 10
2 4 10
1 3 1
3 4 100

예제 출력 1

1

C++ code

#include <stdio.h>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
typedef long long ll;
const ll inf = LLONG_MAX;

typedef struct
{
	vector<int> to, cost;
}Road;

typedef struct
{
	ll city, cost, kk;
}pq_elem;

bool operator<(pq_elem x, pq_elem y)
{
	return x.cost > y.cost;
}

int main(void)
{
	int n, m, k, size;
    vector<Road> road;
    vector<vector<ll>> ans;
    priority_queue<pq_elem, vector<pq_elem>> pq;
    
    scanf("%d %d %d", &n, &m, &k);
    road.resize(n+1);
    ans.resize(n+1, vector<ll>(k+1, inf));
    
    for (int i = 0; i < m; i++)
    {
    	int s, e, c;
        scanf("%d %d %d", &s, &e, &c);
        road[s].to.push_back(e);
        road[s].cost.push_back(c);
        road[e].to.push_back(s);
        road[e].cost.push_back(c);
    }
    
    pq.push(pq_elem{1, 0, 0});
    ans[1][0] = 0;
    
    while (pq.size())
    {
    	ll city = pq.top().city, cost = pq.top().cost, kk = pq.top().kk;
        pq.pop();
        
        size = road[city].to.size();
        for (int i = 0; i < size; i++)
        {
        	pq_elem temp;
            temp.city = road[city].to[i];
            temp.cost = cost + road[city].cost[i];
            temp.kk = kk;
            
            if (ans[temp.city][temp.kk] > temp.cost)
            {
            	ans[temp.city][temp.kk] = temp.cost;
                pq.push(temp);
            }
            
            temp.cost = cost;
            temp.kk++;
            if (temp.kk <= k && ans[temp.city][temp.kk] > temp.cost)
            {
            	ans[temp.city][temp.kk] = temp.cost;
                pq.push(temp);
            }
        }
    }
    
    ll minans = ans[n][0];
    for (int i = 1; i <= k; i++)
    	minans = min(minans, ans[n][i]);
    
    printf("%lld\n", minans);
    return 0;
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

1182 - 부분수열의 합  (0) 2020.11.08
1105 - 팔  (0) 2020.11.06
1081 - 합  (0) 2020.11.05
1074 - Z  (0) 2020.11.03
1059 - 수2  (0) 2020.11.02

+ Recent posts