装箱问题 发表于 2018-12-25 分类于 algorithm 本文字数: 649 阅读时长 ≈ 1 分钟 12345678910111213141516171819202122232425262728问题描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。输入格式 第一行为一个整数,表示箱子容量; 第二行为一个整数,表示有n个物品; 接下来n行,每行一个整数表示这n个物品的各自体积。输出格式 一个整数,表示箱子剩余空间。样例输入2468312797样例输出0 01背包 dp[j]代表j容量最多能容纳多少状态转移方程dp[j] = max(dp[j], dp[j-vi[i]]+vi[i])分为选和不选,取最大。 12345678910111213141516171819202122#include<iostream>#include<cstdio>using namespace std;int dp[20010];int vi[50];int main(){ int n,V; cin>>V>>n; for(int i=0;i<n;++i) scanf("%d", &vi[i]); for(int i=0;i<n;++i) { for(int j=V;j>=vi[i]; --j) { dp[j] = max(dp[j], dp[j-vi[i]]+vi[i]); } } cout<<V-dp[V]<<endl; return 0;}