영준이는 학생들의 시험을 위해 N개의 문제를 만들었다.
각 문제의 배점은 문제마다 다를 수 있고, 틀리면 0점 맞으면 배점만큼의 점수를 받게 된다.
학생들이 받을 수 있는 점수로 가능한 경우의 수는 몇 가지가 있을까?
예를 들어, 첫 번쨰 Testcase의 경우, 총 문제의 개수는 3개이며 각각의 배점은 2, 3, 5점이다
가능한 시험 점수의 경우의 수를 살펴보면 0, 2, 3, 5, 7, 8, 10의 7가지가 있다.
두 번째 Testcase의 경우, 총 문제의 개수는 10개이며 각각의 배점은 모두 1점이다.
가능한 시험점수의 경우의 수를 살펴보면 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10으로 모두 11가지이다.
[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 자연수 N(1 ≤ N ≤ 100)이 주어진다.
두 번째 줄에는 각 문제의 배점을 의미하는 N개의 자연수가 공백으로 구분되어 주어진다. 배점은 1이상 100이하의 자연수이다.
[출력]
각 테스트 케이스마다 학생들이 받을 수 있는 점수의 경우의 수를 출력한다.
그냥 배열 하나 선언 해놓고 다 더해보면 되는 문제다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <iostream> #include <string.h> using namespace std; int MAP[100], N,ans,sum; bool check[10001]; void solve() { for(int i=0;i<N;i++) { for(int j= sum;j>=0;j--) { if(check[j]) { check[j+MAP[i]] = true; } } } } int main() { cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false); int tc; cin>>tc; for(int T=1;T<=tc;T++) { ans = 0; sum = 0; cin>>N; memset(MAP, 0, sizeof(MAP)); memset(check, false, sizeof(check)); check[0] = true; for(int i=0;i<N;i++) { cin>>MAP[i]; sum+=MAP[i]; } solve(); for(int i=0;i<=sum;i++) { if(check[i]) ans++; } cout<<'#'<<T<<' '<<ans<<'\n'; } return 0; } | cs |
5650. [모의 SW 역량테스트] 핀볼 게임 (0) | 2020.03.09 |
---|---|
9611. 명진이와 동휘의 숫자 맞추기 D4 (0) | 2020.03.08 |
2819. 격자판의 숫자 이어 붙이기 D4 (0) | 2020.01.17 |
8673. 코딩 토너먼트1 D3 (0) | 2020.01.12 |
8934. 팰린드롬 공포증 D4 (0) | 2020.01.08 |
댓글 영역