【背包型DP】装箱问题

    xiaoxiao2025-05-30  7

    前阵子看了几天DP,今天来练练手。(codevs)

    题目描述 Description

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

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

    输入描述 Input Description

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

    一个整数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函数来做出决策了。
    转载请注明原文地址: https://ju.6miu.com/read-1299411.html
    最新回复(0)