题目描述
有一个箱子容量为 VV,同时有 nn 个物品,每个物品有一个体积。
现在从 nn 个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最小值。
输入格式
第一行共一个整数 VV,表示箱子容量。
第二行共一个整数 nn,表示物品总数。
接下来 nn 行,每行有一个正整数,表示第 ii 个物品的体积。
输出格式
- 共一行一个整数,表示箱子最小剩余空间。
输入输出样例
输入 #1复制
24 6 8 3 12 7 9 7
输出 #1复制
0
说明/提示
对于 100\%100% 数据,满足 0<n \le 300<n≤30,1 \le V \le 200001≤V≤20000。
【题目来源】
NOIP 2001 普及组第四题
拿到这道题,大部分人首先的思路是贪心,即每次选择体积最大的装入箱中。
但是,贪心存在这样一个问题:局部最优解不一定是全局最优解。
用动态规划解决此题:
状态转移方程:
f[j]=max(f[j],f[j-w[i]]+w[i]);
AC代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[50],dp[20001];
int main() {
int n,m,i,j;
cin>>m>>n;
for(i=0; i<n; ++i)
cin>>a[i];
for(i=0; i<n; ++i)
for(j=m; j>=a[i]; j--)
dp[j]=max(dp[j],a[i]+dp[j-a[i]]);
cout <<m-dp[m]<< endl;
return 0;
}