洛谷 P1049 裝箱問題 正難則反 01揹包

2022-03-22 19:06:41 字數 1228 閱讀 5492

題目描述

有乙個箱子容量為v(正整數,0<=v<=20000),同時有n個物品(0<n<=30,每個物品有乙個體積(正整數)。

要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。

輸入輸出格式

輸入格式:

乙個整數,表示箱子容量

乙個整數,表示有n個物品

接下來n行,分別表示這n 個物品的各自體積

輸出格式:

乙個整數,表示箱子剩餘空間。

輸入輸出樣例

輸入樣例#1:246

83127

97輸出樣例#1:0說明

noip2001普及組 第4題

這道題看似是搜尋,但是可以用揹包做。

題目要求求出最小的剩餘空間,也就是要求出最大的可裝重量

這樣,我們可以將乙個物體的重量當作它的價值,進而將題目轉變為乙個基本的01揹包問題:

有乙個箱子容量為v(正整數,0<=v<=20000),同時有n個物品(0<n<=30),每個物品有乙個體積(正整數)和乙個價值(等於體積)。

要求n個物品中,任取若干個裝入箱內,使總價值最大。

對於每乙個物體,都有兩種狀態:裝 與不裝

那麼,對於任意重量m的最大價值 f (m) = max ( f ( m - w[i] ) + w[i], f (m) )(w為重量(即價值))

其中,f ( m - w[i] ) 指在裝了物品i後,箱子的剩餘容量能裝的最大重量

f ( m - w[i] ) + w[i] 指在在裝了物品i後,箱子能裝的最大重量

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

const int maxn = 1e3+5;

const int n = 20005;

#define ll long long

/*有乙個箱子容量為v(正整數,0<=v<=20000),同時有n個物品(0<n<=30),每個物品有乙個體積(正整數)和乙個價值(等於體積)。

要求n個物品中,任取若干個裝入箱內,使總價值最大。

*/int t, m, n;

int c[n], v[n], dp[n];

int main()

}cout << m-dp[m] << endl; //最小的剩餘空間,也就是要求出最大的可裝重量

}}

洛谷 P1049 裝箱問題

題目描述 有乙個箱子容量為v 正整數,0 v 20000 同時有n個物品 0 n 30,每個物品有乙個體積 正整數 要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。輸入輸出格式 輸入格式 乙個整數,表示箱子容量 乙個整數,表示有n個物品 接下來n行,分別表示這n 個物品的各自體積 輸出格...

洛谷P1049 裝箱問題

有乙個箱子容量為v 正整數,0 v 20000 同時有n個物品 0要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。輸入格式 1個整數,表示箱子容量 1個整數,表示有n個物品 接下來n行,分別表示這n個物品的各自體積 輸出格式 1個整數,表示箱子剩餘空間。輸入樣例 1 複製 2468 31...

洛谷P1049 裝箱問題

p1049 裝箱問題 題目描述 有乙個箱子容量為vv 正整數,0 le v le 200000 v 20000 同時有nn個物品 0要求nn個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。輸入輸出格式 輸入格式 11個整數,表示箱子容量 11個整數,表示有nn個物品 接下來nn行,分別表示這n...