C語言【微專案09】—揹包問題0/1[用二進位制逐次加一生成集合子集](採用蠻力法實現)
阿新 • • 發佈:2021-11-24
目錄
【TDTX】
-----------------------------------------------------【C語言—微專案—自編練習】----------------------------------------------------------
----------------------------------------------------------------【TDTX】--------------------------------------------------------------------
【TDTX】
FMethodPackage.c
#include <stdio.h> #include <math.h> #include <stdlib.h> int main() { int n,fz; int i,j; printf("輸入物品個數和揹包負重(n fz):"); scanf("%d %d",&n,&fz); int a[n][2];//C99 printf("輸入重量和價值:\n"); for(i = 0;i < n;i++) { scanf("%d %d",&a[i][0],&a[i][1]); //printf("%d %d\n",a[i][0],a[i][1]); } int size = (int)pow(2,n); int** ls = (int**)malloc(sizeof(int*)*size);//建立一個指標陣列,每個元素可以指向一個int*型別 for(i = 0;i < size;i++) { ls[i] = (int*)malloc(sizeof(int)*n);//將每個元素指向分配的一維陣列 } for(i = 0;i < size;i++) { //生成集合的全部子集 int t; for(t = i,j = n-1;j >= 0;j--) { if(t == 0) { ls[i][j] = 0; continue; } ls[i][j] = t % 2; t = t / 2; } } //下面程式碼用於檢查所有的組合,即重量組合的全部0/1標記子集 // for(i = 0;i < size;i++) // { // for(j = 0;j < n;j++) // { // printf("%d ",ls[i][j]); // } // puts(""); // } int w = 0; int v = 0; int maxv = 0; int gw = 0; int flag = -1; for(i = 0;i < size;i++) { for(w = 0,v = 0,j = 0;j < n;j++) { if(w < fz) { if(ls[i][j] == 1) { w = w + a[j][0]; v = v + a[j][1]; } } else { break; } } if(maxv < v && w <= fz) { maxv = v; flag = i; gw = w; } } printf("重量:\t"); for(i = 0;i < n;i++) { printf("%-5d",a[i][0]); } puts(""); printf("價值:\t"); for(i = 0;i < n;i++) { printf("%-5d",a[i][1]); } puts(""); printf("組合:\t"); for(i = 0;i < n;i++) { printf("%-5d",ls[flag][i]); } printf("\n最佳重量:%d,最大價值:%d",gw,maxv); return 0; }
執行結果示例
1.5個物品,負重15
資料:
5 15
12 4
2 2
1 1
4 10
1 2
2.20個物品,負重200
資料:
20 200
24 50
42 60
20 49
7 15
48 115
4 11
3 8
7 5
52 66
50 25
5 8
9 25
14 40
9 22
55 42
40 30
35 49
33 16
12 12
65 127
------------------------------------------------------第九次發專案類文章有點激動啊!-----------------------------------------------------
-----------------------------------------------------【C語言—微專案—自編練習】----------------------------------------------------------
----------------------------------------------------------------【TDTX】--------------------------------------------------------------------