又見01揹包

2021-08-07 15:36:43 字數 1153 閱讀 7306

描述

有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 

的物品,求所有挑選方案中物品價值總和的最大值。

1 <= n <=100

1 <= wi <= 10^7

1 <= vi <= 100

1 <= w <= 10^9 輸入

多組測試資料。

每組測試資料第一行輸入,n 和 w ,接下來有n行,每行輸入兩個數,代表第i個物品的wi 和 vi。

輸出滿足題意的最大價值,每組測試資料佔一行。

樣例輸入

4 5

2 31 2

3 42 2

樣例輸出

7

分析:題目為正常的01揹包思路,但是因為給定的質量的範圍1e9,太大了,所以轉化思維

普通方法就是直接找最大價值,現在要換種思維,找最小的重量, 因為同樣價值,重量越小,那麼最後能裝的價值就可能越大,所以這個dp[i][j]就表示 當 取 i 個, 價值為j 的時候的最小重量,狀態轉移方程為 dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - value[i]] + weight[i]), 和那個最初推的一樣,不再羅嗦,空間優化之後狀態轉移方程為dp[j] = min(dp[j], dp[j - value[i]] + weight[i]), 同樣的意思,dp[j]表示 價值為j 的時候的最小重量,到最後只要從最大價值往下遍歷這個dp陣列,只要找到dp[j] <= 揹包重量的時候就直接輸出 j , 這時候j就是最大的。

#include #include #include #include #include #include #include #include #include #include using namespace std;  

struct node

a[105];

int dp[10005];

int main()

memset(dp,0x3f3f3f3f,sizeof(dp));

dp[0] = 0;

for(int i = 0;i < n;i++)

}for(int i = sum;i >= 0;i--)}}

return 0;

}

又見01揹包

問題 f 又見01揹包 時間限制 1 sec 記憶體限制 128 mb 提交 4 解決 4 提交 狀態 討論版 題目描述 有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7 1 vi 10...

又見01揹包

這道題是真的狗屎,按照一般思路寫狀態方程ac不了,換個思路寫才行,時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7...

又見01揹包

時間限制 難度 3 描述 有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7 1 vi 100 1 w 10 9 輸入 多組測試資料。每組測試資料第一行輸入,n 和 w 接下來有n行,每行...