问题描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式
第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
输出格式
一个整数,表示箱子剩余空间。
样例输入
24
6
8
3
12
7
9
7
样例输出
0
思路
m[i][j]表示从1-i个物品中选择装入剩余容量为j的集装箱使得集装箱的物品重量最大
v[i]表示n个物品的重量数组
代码
#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
int m[31][20001];//动态规划m[i][j]
int v[31];//表示n个物品的重量数组
//动态规划
//m[i][j]表示从1-i个物品中选择装入剩余容量为j的集装箱使得集装箱的物品重量最大
int main()
{
int pv;
cin>>pv;//表示集装箱的容量
int n;
cin>>n;//表示物品的个数
for(int i=1;i<=n;i++)
cin>>v[i];//输入每个物品的重量
//计算m[1][j]
for(int j=1;j<=pv;j++){
if(j<v[1])
m[1][j]=0;
else
m[1][j]=v[1];
}
//动态规m[2][j]
for(int i=2;i<=n;i++)
for(int j=1;j<=pv;j++){
if(j<v[i])//如果当前容量装不下第j个物品
m[i][j]=m[i-1][j];
else{//如果装得下,规划出最优值
if(m[i-1][j]>=(m[i-1][j-v[i]]+v[i]))
m[i][j]=m[i-1][j];
else
m[i][j]=m[i-1][j-v[i]]+v[i];
}
}
int minnum=pv-m[n][pv];//表示当前集装箱的最小剩余容量
cout<<minnum;
return 0;
}