刚开始写了一个暴力的dfs超时了, 最后看了下题解说是先枚举答案再判断,然后就写了双dfs,全部秒杀,代码如下:
/*ID: m1500293LANG: C++PROG: milk4 */ #include <cstdio> #include <cstring> #include <algorithm>using namespace std; int Q, P; int t[110];bool dfs1(int dept, int a[], int num, int rQ) {if(rQ==0) return true;if(dept==num) return false;bool res = false;for(int i=1; i<=Q/a[dept]; i++){if(rQ-a[dept]*i >= 0)res = res || dfs1(dept+1, a, num, rQ-a[dept]*i);}return res; } bool flog; void dfs(int dept, int a[], int num, int nn) {if(flog) return ;if(num > nn) return;if(num == nn){if(dfs1(0, a, num, Q)){printf("%d ", num);for(int i=0; i<num; i++)printf("%d%c", a[i], i==num-1?'\n':' ');flog = true;}return ;}if(dept == P) return;a[num] = t[dept];dfs(dept+1, a, num+1, nn);dfs(dept+1, a, num, nn); } bool cmp(const int &a, const int &b) {return a<b; } int main() {freopen("milk4.in", "r", stdin);freopen("milk4.out", "w", stdout);scanf("%d%d", &Q, &P);for(int i=0; i<P; i++) scanf("%d", &t[i]);sort(t, t+P, cmp);int a[110];flog = false;for(int i=1; i<=P&&!flog; i++){dfs(0, a, 0, i);}return 0; }