装箱问题---动态规划

问题描述

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

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

输入格式

  第一行为一个整数,表示箱子容量;

  第二行为一个整数,表示有n个物品;

  接下来n行,每行一个整数表示这n个物品的各自体积。

输出格式

  一个整数,表示箱子剩余空间。

样例输入

24

6

8

3

12

7

9

7

样例输出

0

这题读完之后多思考思考, 其实就能发现就是0-1背包问题

每个物品的体积就是花费同时也是价值,

也就是说这题可以转化为在总体积为w下,可以得到最大的价值

最后用总体积减去最大的价值就是剩下最少的空间

状态转移方程d[j] = max(d[j], d[j - a[i]] + a[i]);

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int n;
int d[20005];
int a[35];
int main(){
	int w;
	scanf("%d%d", &w, &n);
	int i, j;
	for (i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}
	memset(d, 0, sizeof(d));
	for (i = 0; i < n; i++){
		for (j = w; j >= a[i]; j--)
			d[j] = max(d[j], d[j - a[i]] + a[i]);

	}
	printf("%d\n", w - d[w]);
	return 0;
}
时间: 2024-10-05 16:04:35

装箱问题---动态规划的相关文章

【动态规划】【零一背包】CODEVS 1014 装箱问题 2001年NOIP全国联赛普及组

1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int n,m,w[31],f[30001]; 5 int main() 6 { 7 scanf("%d%d",&m,&n); 8 for(int i=1;i<=n;i++) scanf("%d",&w[i]); 9 for(int i=1;i<=n;i++) 10 for(i

动态规划:背包问题

例题:装箱问题 ( http://www.wikioi.com/problem/1014/  ) 题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入描述 一个整数v,表示箱子容量,一个整数n,表示有n个物品 接下来n个整数,分别表示这n 个物品的各自体积 输出描述 一个整数,表示箱子剩余空间. 样例输入 24 6 8 3 12 7 9 7

动态规划概述

动态规划 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法--动态规划.1957年出版了他

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

算法学习 - 动态规划(DP问题)(C++)

这几天一直再看,觉得看懂了一些,先记下来. 动态规划 动态规划是运筹学的一个方向,就是把多级最优化问题分解成一系列的单阶问题.在不断增加的过程中,不断的计算当前问题的最优解. 一般分为如下四个部分: 线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等: 区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等: 树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等: 背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等: 汽车

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

归并排序 求逆序数 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 首先考虑下如何将将二个有序数列合并.这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数.然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可. //将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c

动态规划、记忆化搜索、Dijkstra算法的总结

动态规划 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的.若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次.如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这

优化问题 Optimization Problems &amp; 动态规划 Dynamic Programming

2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题(亦译为受约束的最优化问题)是一类数学最优化问题,它由目标函数以及与目标函数中的变量相关的约束条件两部分组成,优化过程则为在约束条件下最优化(最大化或最小化)目标函数. 经典的优化问题: 最短路问题 旅行商问题(TSP) 装箱问题 调度问题 背包问题 了解并熟练掌握这些经典的优化问题会对以后遇到的新的

分享会之动态规划

一.简介 有这样一种具有特殊性的过程,其可以将被分成若干相互联系的阶段,在它的每个阶段都要做出决策,从而使整个过程达到最好的活动效果.但各个阶段决策的选取不是任意的,依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线. 在求解这种活动过程的最优化结果的时候,通常有4种思路,①暴力穷举:将所有可能的决策序列枚举出来,然后比较每个序列的结果,得到最好的:②简单递归:自顶向下,以边界条件作为递归的结束:③备忘录算法:将每一阶段的决策保