1. 程式人生 > 其它 >C語言【微專案09】—揹包問題0/1[用二進位制逐次加一生成集合子集](採用蠻力法實現)

C語言【微專案09】—揹包問題0/1[用二進位制逐次加一生成集合子集](採用蠻力法實現)

目錄
【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】--------------------------------------------------------------------