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;
}

 

posted @ 2013-05-09 12:12  J.Z's World  阅读(177)  评论(0编辑  收藏  举报