Milk Measuring[USACO]
dfsid。因为dfs的顺序不能保证数字序小的组合先被搜索到,所以搜到第一个可行解时候不能输出,而应该拷贝到候选数组中。并在此后搜索时直接跳过大于候选集数字序的搜索。
/* ID: zhangyc1 LANG: C++ TASK: milk4 */ #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std; int Q, N, nCheck; int arrVol[100], arrAns[100], arrCur[100]; bool bFound = false; int cmp(const void* argv1, const void* argv2) { return *(int*)argv1 - *(int*)argv2; } void prepairData() { scanf("%d%d", &Q, &N); for (int i = 0; i < N; i++) { scanf("%d", arrVol + i); } qsort(arrVol, N, sizeof(int), cmp); } void dfs(int nDepth, int nIndex, int nLeft) { if (nDepth == nCheck) { if (nLeft == 0) { bFound = true; memcpy(arrAns, arrCur, sizeof(arrAns)); } return; } if (nIndex >= N || nLeft < arrVol[nIndex]) return; if (bFound && arrVol[nIndex] > arrAns[nDepth]) return; arrCur[nDepth] = arrVol[nIndex]; for (int i = 1; i <= nLeft / arrVol[nIndex]; i++) dfs(nDepth+1, nIndex+1, nLeft - i * arrVol[nIndex]); dfs(nDepth, nIndex + 1, nLeft); } void process() { for (nCheck = 1; nCheck <= N; nCheck++) { dfs(0, 0, Q); if (bFound) break; } printf("%d", nCheck); for (int i = 0; i < nCheck; i++) printf(" %d", arrAns[i]); printf("\n"); } int main(){ FILE *streamIn = freopen("milk4.in","r",stdin); FILE *streamOut = freopen("milk4.out","w",stdout); prepairData(); process(); fclose(streamIn); fclose(streamOut); return 0; }