1. 程式人生 > >01揹包問題--C語言程式碼

01揹包問題--C語言程式碼

01揹包問題的解釋可以看百度百科:01揹包問題

自己不太懂,不過看這個程式碼好像有點理解的意思了,就先收藏一下程式碼吧

/********************************************************/
/*揹包問題:有m件物品和一個承重為t的揹包。              */
/*          第i件物品的重量是w[i],價值是v[i]。         */
/*          求解將哪些物品裝入揹包可使這些物品的        */
/*          重量總和不超過揹包承重量t,且價值總和最大。 */
/********************************************************/

#include <stdio.h>
#include <string.h>

int f[1010]; // 記錄不同承重量揹包的總價值
int w[1010]; // 記錄不同物品的重量
int v[1010]; // 記錄不同物品的價值

//返回x,y的最大值
int max(int x,int y)
{
    if(x>y)
        return x;
    return y;
}

int main()
{
    int t; // 揹包的承重量
    int m; // 物品的數量
    int i,j; // 臨時變數
    
    memset(f,0,sizeof(f));  //總價值初始化為0
    printf("請輸入揹包承重量 物品的數量:\n");
    scanf("%d %d",&t,&m);  //輸入揹包承重量t、物品的數目m
    printf("請輸入每件物品的重量 價值:\n");
    for(i = 1; i <= m; i++)
        scanf("%d %d",&w[i],&v[i]);  //輸入m組物品的重量w[i]和價值v[i]

    //嘗試放置每一個物品
    for(i = 1; i <= m; i++)
    {  
        for(j = t; j >= w[i]; j--)
        {
            //在放入第i個物品前後,檢驗不同j承重量揹包的總價值
            //如果放入第i個物品後比放入前的價值提高了,則修改j承重量揹包的價值,否則不變
            f[j] = max(f[j-w[i]]+v[i],f[j]);
        }
    }


    printf("裝入揹包的物品\"重量:價值\" :\n");
    j=t;  // 臨時記錄揹包重量
    for(i=1;i<=m;i++)
    {
        // 如果物品被放入,一定符合這樣的條件
        if(f[j] == f[j-w[i]] + v[i])
        {
            printf("%d:%d\n",w[i],v[i]);
            j -= w[i];
        }
    }

    
    printf("揹包最終重量 價值\n");
    printf("%d %d\n",t,f[t]);  
    getch();
    return 0;
}