裝箱問題---動態規劃
阿新 • • 發佈:2019-01-09
問題描述 有一個箱子容量為V(正整數,0<=V<=20000),同時有n個物品(0<n<=30),每個物品有一個體積(正整數)。
要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。輸入格式 第一行為一個整數,表示箱子容量;
第二行為一個整數,表示有n個物品;
接下來n行,每行一個整數表示這n個物品的各自體積。輸出格式 一個整數,表示箱子剩餘空間。樣例輸入24
6
8
3
12
7
9
7樣例輸出0這題讀完之後多思考思考, 其實就能發現就是0-1揹包問題每個物品的體積就是花費同時也是價值,也就是說這題可以轉化為在總體積為w下,可以得到最大的價值最後用總體積減去最大的價值就是剩下最少的空間狀態轉移方程d[j] = max(d[j], d[j - a[i]] + a[i]);
要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。輸入格式 第一行為一個整數,表示箱子容量;
第二行為一個整數,表示有n個物品;
接下來n行,每行一個整數表示這n個物品的各自體積。輸出格式 一個整數,表示箱子剩餘空間。樣例輸入24
6
8
3
12
7
9
7樣例輸出0這題讀完之後多思考思考, 其實就能發現就是0-1揹包問題每個物品的體積就是花費同時也是價值,也就是說這題可以轉化為在總體積為w下,可以得到最大的價值最後用總體積減去最大的價值就是剩下最少的空間狀態轉移方程d[j] = max(d[j], d[j - a[i]] + a[i]);
推薦一個公眾號,不吐槽,不毒舌,偶爾發發文章,偶爾推薦好物,歡迎關注或者有女票的程式狗們推薦給女票![這裡寫圖片描述](https://img-blog.csdn.net/201805082344360?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNzQ3MDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int n; int d[20005]; int a[35]; int main(){ int w; scanf("%d%d", &w, &n); int i, j; for (i = 0; i < n; i++){ scanf("%d", &a[i]); } memset(d, 0, sizeof(d)); for (i = 0; i < n; i++){ for (j = w; j >= a[i]; j--) d[j] = max(d[j], d[j - a[i]] + a[i]); } printf("%d\n", w - d[w]); return 0; }