ALGO-21 装箱问题
问题描述:有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
【输入形式】
第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
【输出形式】
一个整数,表示箱子剩余空间。
【样例输入】
24
6
8
3
12
7
9
7
【样例输出】
0
分析:这道题很显然是动态规划里面的01背包问题,由于输出只要求打印出他的最小剩余,那么通过动态规划找到它的最优解即可。本题可以看做是每个箱子的消耗容量和他的价值一样。所以,C语言代码如下:
#include <stdio.h>
int main(void)
{
int v;
int i,j;
scanf("%d",&v);
int n;
scanf("%d",&n);
int weight[n];
int dp[n+1][v+1];
memset(weight,0,sizeof(weight));
memset(dp,0,sizeof(dp));
for(i=1; i<=n; i++)
{
scanf("%d",&weight[i]);
}
for(i=1; i<=n; i++)
{
for(j=1; j<=v; j++)
{
if(j<weight[i])
{
dp[i][j] = dp[i-1][j];
}
else
{
dp[i][j] = dp[i-1][j] > dp[i-1][j-weight[i]]+weight[i] ? dp[i-1][j] : dp[i-1][j-weight[i]]+weight[i];
}
}
}
printf("%d",v-dp[i-1][j-1]);
}