File tree 1 file changed +46
-0
lines changed
PAT (Advanced Level) Practice
1 file changed +46
-0
lines changed Original file line number Diff line number Diff line change
1
+ #include < cstdio>
2
+ #include < algorithm>
3
+ using namespace std ;
4
+ int cmp (const int &a, const int &b) { return a > b;}
5
+
6
+ int main (){
7
+ int N, M, f[10001 ];
8
+ scanf (" %d%d" , &N, &M);
9
+ for (int i = 1 ; i <=N; ++i)
10
+ scanf (" %d" , &f[i]);
11
+ sort (f+1 , f+N+1 , cmp);
12
+ int dp[M+1 ] = {0 };
13
+ int choice[N+1 ][M+1 ];
14
+
15
+ for (int i = 1 ; i <= N; ++i){
16
+ for (int v = M; v >= f[i]; --v){
17
+ if (dp[v] <= dp[v-f[i]] + f[i]){
18
+ dp[v] = dp[v-f[i]] + f[i];
19
+ choice[i][v] = 1 ;
20
+ }
21
+ else
22
+ choice[i][v] = 0 ;
23
+ }
24
+ }
25
+ if (dp[M] != M) printf (" No Solution" );
26
+ else {
27
+ int flag[N+1 ] = {0 };
28
+ int k = N, num = 0 , v = M;
29
+ while (k >= 0 ){
30
+ if (choice[k][v] == 1 ){
31
+ flag[k] = 1 ;
32
+ v -= f[k];
33
+ num++;
34
+ }
35
+ k--;
36
+ }
37
+ for (int i = N; i >= 1 ; --i){
38
+ if (flag[i]){
39
+ printf (" %d" , f[i]);
40
+ --num;
41
+ if (num > 0 ) printf (" " );
42
+ }
43
+ }
44
+ }
45
+ return 0 ;
46
+ }
You can’t perform that action at this time.
0 commit comments