洛谷P1049裝箱問題題解--zhengjun

題目描述

有一個箱子容量爲VV(正整數,0V200000 \le V \le 20000),同時有nn個物品(0<n300<n \le 30),每個物品有一個體積(正整數)。

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

輸入格式

11個整數,表示箱子容量

11個整數,表示有nn個物品

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

輸出格式

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

輸入輸出樣例

輸入 #1 複製
24
6
8
3
12
7
9
7
輸出 #1 複製
0

說明/提示

NOIp2001NOIp2001普及組 第44

思路

想當年普及第四題竟然是這個難度,哎哎哎哎哎……沒辦法

好吧進入正題。

這個一看就是揹包問題,那麼爲了讓剩餘的體積最小,那麼就要讓裝的最多,那麼,一般的揹包是價值最大,我們不妨讓一個物品的價值就等於體積,這樣就可以使價值最大也就是體積最大了。

如果還沒有會滾動數組的話。

參見洛谷P1048採藥題解–zhengjun

代碼

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define maxn 31
using namespace std;
int n,m;
int f[20001],v[maxn];//採用滾動
int main(){
	scanf("%d%d",&m,&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&v[i]);
		for(int j=m;j>=v[i];j--){
			f[j]=max(f[j],f[j-v[i]]+v[i]);
		}
	}
	printf("%d",m-f[m]);//求剩餘體積
    return 0;
}

謝謝–zhengjun

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