1. 程式人生 > >回溯法之0-1揹包問題(C實現)

回溯法之0-1揹包問題(C實現)

#include<stdio.h>
int n,c,bestp;//物品的個數,揹包的容量,最大價值
int p[10000],w[10000],x[10000],bestx[10000];//物品的價值,物品的重量,x[i]暫存物品的選中情況,物品的選中情況


void Backtrack(int i,int cp,int cw)
{ //cw當前包內物品重量,cp當前包內物品價值
    int j;
    if(i>n)//回溯結束
    {
        if(cp>bestp)
        {
            bestp=cp;
            for(i=0;i<=n;i++) bestx[i]=x[i];
        }
    }
    else 
        for(j=0;j<=1;j++)  
        {
            x[i]=j;
            if(cw+x[i]*w[i]<=c)  
            {
                cw+=w[i]*x[i];
                cp+=p[i]*x[i];
                Backtrack(i+1,cp,cw);
                cw-=w[i]*x[i];
                cp-=p[i]*x[i];
            }
        }
}


int main()
{
    int i;
    bestp=0; 
    printf("請輸入揹包最大容量:");
    scanf("%d",&c);
    printf("請輸入物品個數:");
    scanf("%d",&n);
    printf("請依次輸入物品的重量:");
    for(i=1;i<=n;i++) 
        scanf("%d",&w[i]);
    printf("請依次輸入物品的價值:");
    for(i=1;i<=n;i++) 
        scanf("%d",&p[i]);
    Backtrack(1,0,0);
    printf("最大價值為:");
    printf("%d\n",bestp);
    printf("被選中的物品依次是(0表示未選中,1表示選中):");
    for(i=1;i<=n;i++) 
        printf("%d ",bestx[i]);
    printf("\n");
    system("pause");
    return 0;
}

執行效果圖