가능한 시험 점수

108번뇌·2021년 6월 19일
0

이문제 처음 DFS로 풀었는데 시간초과 뜬다.


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

int iLast;
set<int>sCon;
vector<int> vScore;

void dfs(int start, int depth)
{
    if (depth == iLast)
    {
        sCon.insert(start);
        return;
    }
    dfs(start + vScore[depth], depth + 1);//더해주는경우
    dfs(start, depth + 1);//안더하고 0으로 처리해버리는 경우
}



int main() 
{
    int testcase(0); cin >> testcase;
    for (int m = 0; m < testcase; m++)
    {
        vScore.clear();
        int iSize; cin >> iSize;
        iLast = iSize;

        for (int i = 0; i < iSize; i++)
        {
            int iTemp; cin >> iTemp;
            vScore.emplace_back(iTemp);
        }

        dfs(vScore[0], 1);//0아닌경우
        dfs(0, 1);//0인경우

        cout << "#" << m + 1 << " " << sCon.size() << endl;
    }
}

두번째는 dfs말고(인터넷참조)

#include <iostream>
#include <string.h>
#include <vector>

using namespace std;

int N;
int score[100];
bool visited[10001];
vector<int> canScore;
int answer;

int main() {

    int test_case;
    int T;

    cin >> T;

    for (test_case = 1; test_case <= T; test_case++) {

        //초기화
        N = 0;
        memset(score, 0, sizeof(score));
        memset(visited, false, sizeof(visited));
        canScore.clear();
        answer = 0;

        //입력
        cin >> N;
        for (int i = 0; i < N; i++) {
            cin >> score[i];
        }

   
        //해법
        //0점부터 시작
        canScore.push_back(0);
        visited[0] = true;

        for (int i = 0; i < N; i++)
        {
            int iSize = canScore.size();
            for (int j = 0; j < iSize; j++)
            {
                int newScore = score[i] + canScore[i];

                if (!visited[newScore])
                {
                    canScore.emplace_back(newScore);
                    visited[newScore] = true;
                }
            }

        }

        //결과 갱신
        answer = canScore.size();

        //출력
        cout << "#" << test_case << " " << answer << "\n";
    }

    //종료
    return 0;
}
    for (int i = 0; i < N; i++)
    {
        int iSize = canScore.size();
        for (int j = 0; j < iSize; j++)
        {
            int newScore = score[i] + canScore[i];

            if (!visited[newScore])
            {
                canScore.emplace_back(newScore);
                visited[newScore] = true;
            }
        }

    }

이부분 새롭게 추가하는 방식 논리적으로 이해하기

profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글

관련 채용 정보