您的位置:首页 > 其它

【背包型DP】装箱问题

2016-08-14 21:37 218 查看
前阵子看了几天DP,今天来练练手。(codevs)

题目描述 Description

有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。

要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入描述 Input Description

一个整数v,表示箱子容量

一个整数n,表示有n个物品

接下来n个整数,分别表示这n 个物品的各自体积

输出描述 Output Description

一个整数,表示箱子剩余空间。

样例输入 Sample Input

24

6

8

3

12

7

9

7

样例输出 Sample Output

0

这算是最基础的背包型DP问题。代码也很简单,但是却能体现出动态规划思想,状态转移方程也显而易见。

这里贴个AC了的代码:

#include<iostream>
#include<algorithm>
using namespace std;
int c, n,d[30],f[20000];

int main()
{
cin >> c >> n;
for (int i = 0; i < n; i++)
cin >> d[i];

for(int i=0;i<n;i++)
for(int j=c;j>=d[i];j--)
f[j] = max(f[j], f[j-d[i]]+d[i]);
cout << c - f[c] << endl;
return 0;

}


面对当前物品时,决策无非就是装进箱子中或者不装进箱子中两种。若是选择装入箱子,则是转移方程中后面写到的情况:f[j-d[i]]+d[i], 若是不装入,则还是f[j]。至于如何做出选择,由题中描述,结果使剩余空间最小,即不超过边界情况下所占空间最大,就要用到algorithm中带有的max函数来做出决策了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 算法 背包