poj_3628 动态规划
题目大意
有N个数字,大小为a[i], 给定一个数S,用这N个数中的某些数加起来使得结果sum>= S,且sum-S最小,求该最小的sum-S值。
题目分析
题意中可知,这N个数字的和肯定大于S。那么可以先判断对于大于S的数s1,能否利用这N个物品的某些组合得到,然后找到最小的s1即可。利用动态规划的思想,设f[i][w] 表示能否利用前i种物品的某个组合加和得到w,有f[i][w] = f[i-1][w] || f[i-1][w-a[i]] + a[i].
那么问题来了,要求的f[i][w]的w的范围是多少呢?设最大的a[i]为A,首先w肯定要大于S,然后w小于S+A。假设w大于等于S+A,那么即使知道了某个 f[i][w]为true(即可以通过N个数的某个组合加和得到w),那么肯定可以通过这N个数字的加和得到 w - a[i] >= S(a[i]为构成w的数字的集合中的任意一个数字)。在选择s1的时候会选择w-a[i]而非w,从而w大于等于S+A没有意义。
实现(c++)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MAX_HEIGHT 20000005
int cow_height[25];
bool f[MAX_HEIGHT];
int max(int a, int b){
return a > b ? a : b;
}
int main(){
int n, b_height, total_height = 0, max_height = 0;
while (scanf("%d %d", &n, &b_height) != EOF){
total_height = 0, max_height = 0;
for (int i = 0; i < n; i++){
scanf("%d", cow_height + i);
total_height += cow_height[i];
max_height = max(max_height, cow_height[i]);
}
int m = max_height + b_height;
for (int i = 0; i <= m; i++){
f[i] = false;
}
f[0] = true;
f[cow_height[0]] = true;
for (int i = 1; i < n; i++){
for (int w = m; w >= cow_height[i]; w--){
f[w] = f[w] || f[w - cow_height[i]];
}
}
for (int i = b_height; i < m; i++){
if (f[i]){
printf("%d\n", i - b_height);
break;
}
}
}
return 0;
}
poj_3628 动态规划的更多相关文章
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划
[BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...
- POJ 1163 The Triangle(简单动态规划)
http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
随机推荐
- __packed字节对齐
比如: typedef __packed struct READ_Command{ u_char code; u_int addr; u_char len;} READ_Comman ...
- LDO和BUCK降压稳压器对比
LDO和BUCK降压稳压器对比 在采用MCU/DSP/FPGA设计的控制系统中,低压输入级(一般在12V以下),输出5V/3.3V/1.8V/1.5V/1.2V的电路中,常用的电源芯片是BUCK(降压 ...
- MySQL Subquery
Summary: in this tutorial, we will show you how to use the MySQL subquery to write complex queries a ...
- vsftpd問題集
vsftpd无法看到文件:226 Transfer done (but failed to open directory). 原因:目录不是一个 world_readable目录 解决方法:在配置文件 ...
- IOS基于XMPP协议开发--XMPPFramewok框架(二):服务器连接
连接服务器前需准备事项: 1.搭建好XMPP服务器 2.设置服务器地址和端口 [_xmppStream setHostName:@"127.0.0.1"]; [_xmppStrea ...
- Delphi记录record中的变体
program Day4; {$APPTYPE CONSOLE} uses SysUtils, Util in 'Util.pas'; type TPerson = packed record ID ...
- yii2 ContentDecorator 和 block 挂件
在做网站的过程中,大部分的页面结构都是相似的.如都有相同的头部和底部.各个页面这样仅仅是中间的部分不同. Yii中的布局文件就是用来实现这样的功能.如: 布局文件:@app/views/layouts ...
- (3)FluidMoveBehavior 之模仿 Windows Phone 开始菜单的 Tile 长按后排序
这个工程和上一篇 (2)中介绍的排序大同小异,只是比上一篇交换复杂一点,不是通过单击进行交换, 而是拖动一个 Tile 到另一个 Tile 上时,判断两个 Tile 的中心距离是否符合条件来判断是否进 ...
- linux服务器 IE中ico 不能正常显示
问题: mime_type: image/vnd.microsoft.icon 的,但发现在 IE 下面,直接打开 icon 的地址,图标不能正常显示 1.将ico放在windows服务器上,直接访问 ...
- 一款基于css3的散子3D翻转特效
css3使我们能够跳出2d空间,实现3维空间的动画效果,这里给出一个自动翻转的3d色子动画效果制作过程. 第一步,首先进行HTML的布局,对于3D效果,布局有一定的规律,代码如下: <body& ...