0-1背包(回溯法剪枝版)

#include
#define n 3
int maxvalue=0,tot=0;
int w[n]={16,15,15},v[n]={45,25,25},c=30;
int tempweight=0,tempvalue=0;
void dfs(int t)
{
    if(t==n)
    {
        if(tempvalue>maxvalue && tempweight<=c)
            maxvalue=tempvalue;
        return;
    }
    //left subtree
    if(tempvalue<=c && tempvalue+tot>maxvalue)
    {
        tempvalue+=v[t];
        tempweight+=w[t];
        tot-=v[t];
        dfs(t+1);
        tempvalue-=v[t];
        tempweight-=w[t];
        tot+=v[t];
    }
    //right subtree
    if(tempvalue+tot>maxvalue)
    {
       tot+=v[t];
       dfs(t+1);
       tot-=v[t];
    }

}
int main()
{
    int i;
    for(i=0;i     {
        tot+=v[i];
    }

    dfs(0);
    printf("%d\n",maxvalue);
    return 0;
}

你可能感兴趣的:(暴力回溯)