パッキング学習アルゴリズムの問題
制限時間:メモリ制限が1.0S:256.0メガバイト
問題の説明
ボックス容量V(正の整数、0 <= V <= 20000を有している )、 アイテム(0 <N <= 30)のNがありながら 、 各項目は、ボリューム(正の整数)を有しています。
n個のアイテムの残りの空間要件ボックスが最小化されるように、ボックスに番号のいずれかを取ります。
入力フォーマット
最初の行為のボックスの容量を表す整数、
二行目は整数、n個の項目があることを示し、
次のn行、各行は、n個のアイテムのそれぞれの整数の体積を表します。
出力は、フォーマット
ボックスの残りの空間を表す整数。
サンプル入力
24
。6
。8
。3
12である
。7
。9
。7
サンプル出力
0
分析:セットの容量として、第一の処理にボックス、アイテムの後のスペースが占有されています。そこ漸化式:
#include <stdio.h>
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int V, n;
int volume[35] = { 0 };
int f[35][20005] = { 0 };
scanf("%d", &V);
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &volume[i]);
for (int i = 1; i <= n; ++i)
{
for (int v = 0; v < volume[i]; ++v)
f[i][v] = f[i-1][v];
for (int v = volume[i]; v <= V; ++v)
f[i][v] = max(f[i-1][v], f[i-1][v-volume[i]] + volume[i]);
}
printf("%d", V - f[n][V]);
return 0;
}