回溯法之0-1揹包問題(C實現)
阿新 • • 發佈:2019-02-08
#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; }
執行效果圖