EOJ(动态规划)——1113. 装箱问题

单测试点时限: 2.0 秒

内存限制: 256 MB

有一个箱子容量为 V (正整数,0≤V≤20000),同时有 n 个物品(0<n≤30),每个物品有一个体积(正整数)。要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入
输入有多组测试数据,第一行一个正整数 V, 表示箱子的容量

第二行一个数据 n 表示物品个数。

第三行有 n 个数据,描述每个物品的体积

输出
每个输出占一行,输出箱子最后剩下的最小体积

样例
input
24 一个整数,表示箱子容量
6 一个整数,表示有n个物品
8 3 12 7 9 7分别表示这n个物品的各自体积
output
0 一个整数,表示箱子剩余空间
hint:汉字是不需要处理的,只是为了描述题目

题目大意:

给n个有独立体积的物品,放入总体积为V的箱子中,问箱子最后剩下的最小体积多少。

题目解析:

同样是01背包问题。

具体代码:

#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 35
int weight[MAXN];
int dp[MAXN][20005];//dp[i][j]表示前i件物品放入空间为j所占据的最大空间
int main() {
	int V,n;
	while(cin>>V>>n) {
		for(int i=1; i<=n; i++)
			cin>>weight[i];
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=V; j++) {
				if(weight[i]>j)
					dp[i][j]=dp[i-1][j];
				else {
					dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+weight[i]);
				}
			}
		}
		cout<<V-dp[n][V]<<endl;
	}
	return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务