题目描述(题目难度:简单)
有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积(正整数)。 要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。 输入格式 第一行是一个整数 V,表示箱子容量。 第二行是一个整数 n,表示物品数。 接下来 n 行,每行一个正整数(不超过10000),分别表示这 n 个物品的各自体积。 输出格式 一个整数,表示箱子剩余空间。 数据范围 0<V≤20000, 0<n≤30 输入样例: 24 6 8 3 12 7 9 7 输出样例: 0
解题报告
对于题目中可以解读出,这些物品最多只能用一次,而且,看到最小值三个字,那么可以向01背包的方向靠近,题目中所给的箱子容积就可以理解为背包体积。
参考代码
#include <iostream> #include <algorithm> using namespace std; const int N =20010 , M = 40;//N用于箱子容积,M用于物品个数 int v[N];//每个商品的体积 int f[N];//表示状态的集合 int n,m;//箱子容积和个数 int main() { ios::sync_with_stdio(false); cin >> n >> m; //录入m个物品的体积 for(int i = 1; i <= m;i++) cin >> v[i]; //dp for(int i = 1;i <= m;i++) for(int j = n;j >= v[i];j--) f[j] = max(f[j],f[j-v[i]]+v[i]); cout << n - f[n] << endl; return 0; }