标签:
input | output |
---|---|
270 4 100 110 170 200 |
2 4 |
270 4 100 110 160 170 |
-1 |
270 4 100 120 160 180 |
0 |
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <deque> 6 #include <vector> 7 #include <queue> 8 #include <iostream> 9 #include <algorithm> 10 #include <map> 11 #include <set> 12 #include <ctime> 13 #include <iomanip> 14 using namespace std; 15 typedef long long LL; 16 typedef double DB; 17 #define For(i, s, t) for(int i = (s); i <= (t); i++) 18 #define Ford(i, s, t) for(int i = (s); i >= (t); i--) 19 #define Rep(i, t) for(int i = (0); i < (t); i++) 20 #define Repn(i, t) for(int i = ((t)-1); i >= (0); i--) 21 #define rep(i, x, t) for(int i = (x); i < (t); i++) 22 #define MIT (2147483647) 23 #define INF (1000000001) 24 #define MLL (1000000000000000001LL) 25 #define sz(x) ((int) (x).size()) 26 #define clr(x, y) memset(x, y, sizeof(x)) 27 #define puf push_front 28 #define pub push_back 29 #define pof pop_front 30 #define pob pop_back 31 #define ft first 32 #define sd second 33 #define mk make_pair 34 inline void SetIO(string Name) 35 { 36 string Input = Name+".in", 37 Output = Name+".out"; 38 freopen(Input.c_str(), "r", stdin), 39 freopen(Output.c_str(), "w", stdout); 40 } 41 42 inline int Getint() 43 { 44 int Ret = 0; 45 char Ch = ‘ ‘; 46 bool Flag = 0; 47 while(!(Ch >= ‘0‘ && Ch <= ‘9‘)) 48 { 49 if(Ch == ‘-‘) Flag ^= 1; 50 Ch = getchar(); 51 } 52 while(Ch >= ‘0‘ && Ch <= ‘9‘) 53 { 54 Ret = Ret * 10 + Ch - ‘0‘; 55 Ch = getchar(); 56 } 57 return Flag ? -Ret : Ret; 58 } 59 60 const int N = 110, M = 100010; 61 int n, m, Arr[N]; 62 int Dp[M], G[M]; 63 bool Visit[N]; 64 vector<int> Ans; 65 66 inline void Input() 67 { 68 scanf("%d", &m); 69 scanf("%d", &n); 70 For(i, 1, n) scanf("%d", Arr + i); 71 } 72 73 inline void Search(int x) 74 { 75 if(!x) return; 76 Visit[G[x]] = 1; 77 Search(x - Arr[G[x]]); 78 } 79 80 inline void Solve() 81 { 82 Dp[0] = 1; 83 int Max = 0; 84 For(i, 1, n) 85 { 86 Max += Arr[i]; 87 if(Max > m) Max = m; 88 Ford(j, Max, Arr[i]) 89 if(Dp[j - Arr[i]]) 90 { 91 Dp[j] += Dp[j - Arr[i]]; 92 if(!G[j]) G[j] = i; 93 } 94 } 95 96 if(Dp[m] > 1) puts("-1"); 97 else if(!Dp[m]) puts("0"); 98 else 99 { 100 Search(m); 101 For(i, 1, n) 102 if(!Visit[i]) Ans.pub(i); 103 int Length = sz(Ans); 104 Rep(i, Length - 1) printf("%d ", Ans[i]); 105 printf("%d\n", Ans.back()); 106 } 107 } 108 109 int main() 110 { 111 #ifndef ONLINE_JUDGE 112 SetIO("C"); 113 #endif 114 Input(); 115 Solve(); 116 return 0; 117 }
标签:
原文地址:http://www.cnblogs.com/StupidBoy/p/4964523.html