前阵子看了几天DP,今天来练练手。(codevs)
题目描述 Description
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入描述 Input Description一个整数v,表示箱子容量
一个整数n,表示有n个物品
接下来n个整数,分别表示这n 个物品的各自体积
输出描述 Output Description一个整数,表示箱子剩余空间。
样例输入 Sample Input24
6
8
3
12
7
9
7
样例输出 Sample Output0
这算是最基础的背包型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函数来做出决策了。