回溯法解01揹包問題(C語言版)
阿新 • • 發佈:2019-02-06
/*test.h*/ #include<stdio.h> //-------------巨集定義------------ #define OK 0 //-----------變數宣告-------------- int x[100],bestx[100]; int cv = 0,cw = 0,mw = 0,mv = 0; int c,n; int weight[100]; int value[100]; //-------------函式宣告------------ int Output(); int Input(); void Init(); bool place(int t); void Track(int t);
/*test.cpp*/ #include"test.h" void Init() { int i; for(i = 0;i<100;i++) { x[i] = 0; bestx[i] = 0; weight[i] = 0; value[i] = 0; } } int Input() { int i; printf("請輸入揹包的容量:"); scanf("%d",&c); printf("請依次輸入物品的重量:"); for(i=0;i<n;i++) scanf("%d",(weight+i)); printf("請依次輸入物品的價值:"); for(i=0;i<n;i++) scanf("%d",(value+i)); return OK; } int Output() { printf("選擇的物品是:"); for(int m = 0;m<n;m++) printf("%d ",bestx[m]); printf("\nmax value is :%d\n",mv); return OK; } bool place(int t) { if(cw+weight[t] > c) return false; return true; } //---------回溯法解01揹包問題----------------- void Track(int t) { int m; if(t>=n) { //output if(cv>mv) { mv=cv; for(m = 0;m<n;m++) bestx[m] = x[m]; } } else { for(m = 0;m<=1;m++) { x[t] = m; if(x[t] == 0) { Track(t+1); x[t] = 0; } else if(place(t) && x[t]==1) { cv = cv + value[t]; cw = cw + weight[t]; Track(t+1); x[t] = 0; cv = cv - value[t]; cw = cw - weight[t]; } } } } void main() { Init(); printf("請輸入物品的數量:"); scanf("%d",&n); Input(); Track(0); Output(); }