您的位置:首页 > 其它

算法训练 装箱问题

2018-02-26 20:50 239 查看
  算法训练 装箱问题  时间限制:1.0s   内存限制:256.0MB     问题描述
  有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
  要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。输入格式  第一行为一个整数,表示箱子容量;
  第二行为一个整数,表示有n个物品;
  接下来n行,每行一个整数表示这n个物品的各自体积。输出格式  一个整数,表示箱子剩余空间。
  样例输入
  24
  6
  8
  3
  12
  7
  9
  7样例输出0

代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<stack>
#include<cmath>
using namespace std;
int n, capacity;
int volume[500], need[200];
int cache[20010][101];
int pack(int capacity,int item) {
//初始化,没有可放入的物品时
if (item==n) {
return 0;
}
int &ret = cache[capacity][item];
if (ret!=-1) {
return ret;
}
//不把物品放入时
ret = pack(capacity,item+1);
//将物品放入时
if (capacity>=volume[item]) {
ret = max(ret, pack(capacity - volume[item], item + 1) + need[item]);
}
return ret;
}
int main() {
int V;
cin >> V >> n;
memset(cache,-1,sizeof(cache));//zd
int temp;
for (int i =0; i <n;i++) {
cin >> temp;
volume[i]=temp;
need[i] = temp;
}
cout<<V-pack(V,0);
return 0;
}


思路:    用的是01背包问题的解法,一般01背包会给你背包的体积,物品的体积和价值,要求出尽可能放满背包的同时,价值要最大!!而此题给的是求背包所剩的最小体积。我们可以这样写:将物品的体积当做价值,求价值最大,就是求放入背包的体积最大!!
    之前用部分背包写写看的,也就是用贪心去写的,还得了80分!(虽然不切实际)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: