動態規划------背包問題(c語言)


/*背包問題:
背包所能容納重量為10;共五件商品,商品重量用數組m存儲m[5]={2,2,6,5,4},
每件商品的價值用數組n存儲,n[5]={6,3,5,4,6};求背包所能裝物品的最大價值。
*/
#include<stdio.h>
#include<conio.h>
int main() {
    int m[5] = { 2,2,6,5,4 }, n[5] = { 6,3,5,4,6 };
    int flag[5] = { 0,0,0,0,0 };//符號標志位,表示地某個點是否裝入背包,裝入為1,未裝入為0;
    int i, j, k;
    int c = 10, sum1 = 0, sum2 = 0;//sum1表示最終背包容納的重量。sum2表示最終背包中容納的最大價值的價值。
                                   //設一個二維數組,橫坐標表示所裝物品的標號,縱坐標表示背包所容納的最大重量0~10;
    int mn[5][11];
    for (i = 4; i >= 0; i--) {//二維數組從下至上
        for (j = 0; j <= 10; j++) {
            if (i == 4) {
                if (m[i]>j)
                    mn[i][j] = 0;
                else
                    mn[i][j] = n[i];
            }
            else {
                if (m[i]>j) {
                    mn[i][j] = mn[i + 1][j];
                }
                else {
                    mn[i][j] = mn[i + 1][j]>mn[i + 1][j - m[i]] + n[i] ? mn[i + 1][j] : mn[i + 1][j - m[i]] + n[i];
                }
            }
        }
    }

    for (i = 0; i<5; i++) {
        if (mn[i][c] != mn[i + 1][c]) {//從二維數組上方開始,背包最大值c,mn[i][c]的值若與mn[i+1][c]的值不同,則m[i]未放入背包中(之前是自下往上放的)
            flag[i] = 1;
            c = c - m[i];//若放入背包,則背包可容納總重量減少;
        }
        printf("%d ", flag[i]);
    }//輸出所放入的物品序號

    for (i = 0; i<5; i++) {
        if (flag[i] == 1) {
            sum1 += m[i];
            sum2 += n[i];
        }
    }
    printf("\n背包容納的重量為:%d 背包容納的總價值為:%d", sum1, sum2);

    getch();
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM