NOI2.6.8785 装箱问题题解(C++)
题目传送门
这一题是经典的动态规划,就是有一点点的改动。
题目
8785:装箱问题
总时间限制: 1000ms 内存限制: 65536kB
描述
有一个箱子容量为V(正整数,0<=v<=20000),同时有n个物品(0< n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入
第一行是一个整数V,表示箱子容量。
第二行是一个整数n,表示物品数。
接下来n行,每行一个正整数(不超过10000),分别表示这n个物品的各自体积。
输出
一个整数,表示箱子剩余空间。
样例输入
24
6
8
3
12
7
9
7
样例输出
0
思路
又是动态规划的题目,还是使用基本的套路来解决滴。
代码
#include <bits/stdc++.h>
using namespace std;
int n,t;
int a[35];
int fill(int num/*当前正在考虑第几项物品*/,int v/*剩余的体积*/){
if(num == n){//物品编号是从0~n-1的,所以是到n结束
return v;
}
int a1 = fill(num+1,v);//不选择这个物品
int b = 2147483647;//因为有可能选不了这个物品,所以b要赋初值
if(v>=a[num]/*剩下的体积要能装下这个物品*/){
b = fill(num+1,v-a[num]);
}
return min(a1,b);//求剩下的最小体积,所以用min
}
int main(){
cin>>t>>n;
for(int i = 0;i<n;i++){
cin>>a[i];
}
cout<<fill(0,t);
return 0;
}