1. 程式人生 > >藍橋杯-裝箱問題-動態規劃-java

藍橋杯-裝箱問題-動態規劃-java

問題描述
  有一個箱子容量為V(正整數,0<=V<=20000),同時有n個物品(0<n<=30),每個物品有一個體積(正整數)。
  要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。 輸入格式   第一行為一個整數,表示箱子容量;
  第二行為一個整數,表示有n個物品;
  接下來n行,每行一個整數表示這n個物品的各自體積。 輸出格式   一個整數,表示箱子剩餘空間。
  樣例輸入
  24
  6
  8
  3
  12
  7
  9
  7 樣例輸出

0

解題思路:簡化版的01揹包問題 還是用動態規劃來做

         每種物品對於我們來說只有兩種狀態拿了這種物品和沒拿這種物品

         建立一維陣列角標i表示箱子容量陣列【i】表示在此箱子的容量限制下能達到的體積的最大值

         設物品為第j個

         核心程式碼:陣列【i】 = 陣列【i-j的體積】+j的體積

                  陣列【i】 = 陣列【i】

         比較大小留大的那個就完事了 以下是具體程式碼:

import java.util.Arrays;
import java.util.Scanner;


public class Main {


public static void main(String[] args) {
// TODO 自動生成的方法存根
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
int n = scanner.nextInt();
int m = scanner.nextInt();
int [] arr = new int [n+1];
Arrays.fill(arr, 0);
int [] shu = new int [m+1];
for (int i = 1; i < shu.length; i++) {
shu[i] = scanner.nextInt();
}
for (int i = shu[1]; i < arr.length; i++) {
arr[i] = shu[1];

}
for (int i = 2; i < shu.length; i++) {
for (int j = arr.length-1; j>=1 ; j--) {
int a1 = 0;
if (j-shu[i]>=0) {
a1=arr[j-shu[i]]+shu[i];
}
if (a1>arr[j]) {
arr[j] = a1;
}
}

}
System.out.println(n-arr[n]);
}
}


}