藍橋杯-裝箱問題-動態規劃-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]);
}
}
}