揹包問題——nyoj860 又見01揹包

題目大意應該了都瞭解了吧。
分析:看題中給的數據可知W = 10^9數據太大, 開不了這麼大的數組。但仔細看看你會發現 n<=100 ,vi <= 100 。他的總價值最多也不會超過10000。 那麼我們就開一個d[i]數組,表示價值一定時,所佔重量最小的狀態數組。 這樣數組就不會太大啦! 最重要的就是能想到這個。 其他的和01揹包一樣。


#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;

int n, W, mx, sum, w[110], v[110], d[10010];
int main()
{
    while(scanf("%d%d", &n, &W) != EOF)
    {
        sum = 0;
        for(int i = 1; i <= n; i++)
        {
            scanf("%d%d", &w[i], &v[i]);
            sum += v[i];//累計所有物品的價值
        }
        for(int i = 1; i <= sum; i++)//初始化d[]
            d[i] = 10e8;
        d[0] = 0;
        for(int i = 1; i <= n; i++)
        {
            for(int j = sum; j >= v[i]; j--)
            {
                d[j] = min(d[j], d[j-v[i]] + w[i]);
//                printf("d[%d] = %d d[%d] = %d\n", j, d[j], j-v[i], d[j-v[i]]);
            }
        }
        for(int i = 1; i <= sum; i++)
        {
            if(d[i] <= W)
                mx = i;
        }
        printf("%d\n", mx);
    }
    return 0;
}
發佈了32 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章