動態規劃-完全揹包(1)

01揹包說白了就是一個物品放還是不放的問題,然後一個一個往下推下去,這種決策使得問題變得更加的簡單便捷。

和01揹包相同的還有完全揹包,所謂的完全揹包,就是01揹包的物品不限制個數,可以放置任意件。

完全揹包題目的做法跟01揹包是相同的,只是多了一個數量的問題。

使用我們oj上的採藥,這次是採藥2

我們繼續列上次那樣的表,草藥編號1~5,揹包是m的重量。重量從0開始,一直是增加的,只要增加量不超過揹包的總重量即可。

1.第一株草藥,重77,價值92,0到76爲0,77到100爲92

2.第二株草藥,重33,價值50,0到32爲0,33到65爲50,66到98爲100,99和100爲150

這樣的話,每一株草藥是否採摘還是和上一株草藥的數值有關。

設價值是c[n][m],草藥的重量w[n],價值v[n]。

可以找出表達式:

c[n][m] = max(c[n-1][m], c[n-1][m-w[n]*k]+v[n]*k)    k是m/w所得出的結果

根據上面的表達式可以寫出這個題的代碼,直接貼上

<span style="font-size:18px;">#include <stdio.h>
#define max(a,b) a>b?a:b

int main(){
    int c[1001] = {0};
    int w[1000], v[1000];
    int m, n, i, j, l, k;
    scanf("%d %d", &m, &n);
    for(i=0; i<n; i++){
        scanf("%d %d", &w[i], &v[i]);
    }
    for(j=0; j<n; j++){
        for(l=0; l<=m; l++)
            if(l >= w[j])
                c[l] = max(c[l], c[l-w[j]]+v[j]);
    }
    printf("%d\n", c[m]);
    return 0;
}
</span>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章