描述
有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 52 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行,每行...