藍橋杯 裝箱問題
阿新 • • 發佈:2019-01-11
演算法訓練 裝箱問題
時間限制:1.0s 記憶體限制:256.0MB
錦囊1
動態規劃。
錦囊2
用F[i,j]表示前i個物品裝j的容量是否可以,則F[i,j]=F[i-1,j-a[i]]||F[i-1,j]。其中a[i]表示第i個物品的體積。
問題描述
有一個箱子容量為V(正整數,0<=V<=20000),同時有n個物品(0<n<=30),每個物品有一個體積(正整數)。
要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。 輸入格式 第一行為一個整數,表示箱子容量;
第二行為一個整數,表示有n個物品;
接下來n行,每行一個整數表示這n個物品的各自體積。 輸出格式 一個整數,表示箱子剩餘空間。 樣例輸入 24
6
8
3
12
7
9
7 樣例輸出 0
要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。 輸入格式 第一行為一個整數,表示箱子容量;
第二行為一個整數,表示有n個物品;
接下來n行,每行一個整數表示這n個物品的各自體積。 輸出格式 一個整數,表示箱子剩餘空間。 樣例輸入 24
6
8
3
12
7
9
7 樣例輸出 0
解題報告:這是一個揹包問題的變形。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define max(x,y) ((x)>(y)?(x):(y)) int dp[20000]; int main() { int v,n; scanf("%d%d",&v,&n); int i,j; memset(dp,-100,sizeof(dp)); dp[0]=0;//注意這是關鍵 for(i=0;i<n;i++) { int a; scanf("%d",&a); for(j=v;j>=a;j--) dp[j]=max(dp[j],dp[j-a]+a); } for(i=v;i>=0;i--) if(dp[i]>0) break; printf("%d\n",v-i); //system("pause"); return 0; }