天天看點

裝箱問題(Packing DP)

<Description>

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

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

<input>

第一行為一個正整數V表示箱子的容量,第二行一個正整數N表示物品個數,接下來N行列出這N個物品各自的體積。

<output>

單獨一行,表示箱子最小的剩餘空間。

<input example>

24

6

8

3

12

7

9

7

1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6    bool val[20001];
 7    memset(val,0,sizeof(bool)*20001);
 8    int i,j,V,n,w[31];
 9    scanf("%d",&V);
10    scanf("%d",&n);
11    for(i=1;i<=n;i++)
12      scanf("%d",&w[i]);
13    val[V]=true;
14    for(i=n;i>0;i--)
15    {
16       for(j=V;j>=0;j--)
17       {
18          if(val[j]&&j-w[i]>=0)
19          {
20              val[j-w[i]]=true;
21          }
22       }
23    }
24    for(j=0;j<=V;j++)
25    {
26       if(val[j]) break;
27    }
28    printf("%d",j);
29    while(true);
30    return 0;   
31 }      

<output example>

<問題分析>

經典的0/1背包問題,設定一個BOOL數組來存取狀态,和一個INT數組進行倒序周遊。

狀态轉換方程:opt[j]=opt[j-w[i]]{opt[j]=true;j-w[i]>0}

裝箱問題(Packing DP)