第一題:梱包問題(NOIP 2009試験問題12.08)
梱包の問題
【問題の説明】:1つの箱の容量はv(正の整数、o≦v≦20000)であり、同時にn個の物品(o≦n≦30)があり、各物品に1つの体積(正の整数)がある.m個の物品のうち、任意に千個を箱に入れ、箱の残りの空間を最小限に抑えることが要求される.
【例】
【入力】:(boxes.in)
24個の整数は、箱容量6個の整数を表し、n個の物品8の次のn行を表し、それぞれこのn個の物品のそれぞれの体積を表す.3 12 7 9【出力】:(boxes.out)
0ボックスの空き容量を表す整数です.
【問題の説明】:1つの箱の容量はv(正の整数、o≦v≦20000)であり、同時にn個の物品(o≦n≦30)があり、各物品に1つの体積(正の整数)がある.m個の物品のうち、任意に千個を箱に入れ、箱の残りの空間を最小限に抑えることが要求される.
【例】
【入力】:(boxes.in)
24個の整数は、箱容量6個の整数を表し、n個の物品8の次のn行を表し、それぞれこのn個の物品のそれぞれの体積を表す.3 12 7 9【出力】:(boxes.out)
0ボックスの空き容量を表す整数です.
#include <stdio.h>
#include <stdlib.h>
int n, v;
int d[31];
int ans = 0;
void process(int i, int carry)
{
if (i > n) return ;
if (carry <= v) {
if (carry > ans) ans = carry;
} else return ;
process(i + 1, carry);
if (carry + d[i] > v) return ;
else process(i + 1, carry + d[i]);
}
int main()
{
FILE *in,*out;
ans = 0;
in = fopen("boxes.in","rt");
out = fopen("boxes.out","wt");
fscanf(in, "%d", &v);
fscanf(in, "%d", &n);
int i, j, k;
for (i = 0; i < n; ++i)
fscanf(in, "%d", &d[i]);
process(0, 0);
fprintf(out, "%d
", v - ans);
system("pause");
fclose(in);
fclose(out);
return 0;
}
/*
24
6
8 3 12 7 9 7
*/