裝箱問題

題目描述

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

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

輸入輸出格式

輸入格式:

 

11個整數,表示箱子容量

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

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

 

輸出格式:

 

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

 

輸入輸出樣例

輸入樣例#1: 複製

24
6
8
3
12
7
9
7

輸出樣例#1: 複製

0

#include<cstdio>
using namespace std;
int m,n;                m即箱子容量V
int f[20010];
int w[40];
int main(){
    int i,j;
    scanf("%d%d",&m,&n);
    for(i=1;i<=n;i++){
        scanf("%d",&w[i]);
    }
    for(i=1;i<=n;i++){
        for(j=m;j>=w[i];j--){                            注意:這裏必須是從m到w[i],否則一個物體會被多次裝入箱子,見例1
            if(f[j]<f[j-w[i]]+w[i]){
                f[j]=f[j-w[i]]+w[i];
            }
        }
    }
    printf("%d\n",m-f[m]);
}

這就是下標問題了,靈活應用。

要知道最大也是m以內,要學會轉化爲已知的。

事實證明,普及組的比較垃圾,還是以後整成一篇文章吧。

 

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