题目大意

有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 动态规划的更多相关文章

  1. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  2. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  3. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  4. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  5. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  6. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  7. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  8. 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

  9. POJ 1163 The Triangle(简单动态规划)

    http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

随机推荐

  1. 摘:static,const,inline,define的意义

    static 1) 产生背景 引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想 ...

  2. Android+手势识别详解

      今天就来把以前的学习文章与经验简单总结中出来吧,在这里我就直接把代码贴下来了,希望能给初学者做最佳的学习参考,也希望有更多的开发人员来加入 ANDROID开发团队,参与更多的创新方式的开发,好了, ...

  3. java开源内容管理系统J4CMS支持真正静态化

    原理非常easy,使用httpclient请求遍历整个站点的菜单.文章链接.请求下来以后,生成html文件.即静态化了 把它们稍作调整,直接扔在88元购买的阿里云主机上.站点就完毕了 这是我的 静态站 ...

  4. AHK GUI开发示例

    GUI.AHK Gui, Add, Text, gAllSearchA W120, 搜索引擎类: Gui, Add, Checkbox, gMySubroutine Checked HwndMyEdi ...

  5. 大数据量下MySQL插入方法的性能比较

    不管是日常业务数据处理中,还是数据库的导入导出,都可能遇到需要处理大量数据的插入.插入的方式和数据库引擎都会对插入速度造成影响,这篇文章旨在从理论和实践上对各种方法进行分析和比较,方便以后应用中插入方 ...

  6. ACdream 1084 寒假安排(阶乘素因子分解)

    题目链接:传送门   分析: 求A(n,m)转化成k进制以后末尾0的个数.对k素因子分解,第i个因子为fac[i], 第i个因子的指数为num[i],然后再对n的对A(n,m)进行素因子分解,设cou ...

  7. Linux 用C语言判断文件和文件夹

    Linux 用C语言判断文件和文件夹 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #inc ...

  8. [svc]C10K 问题引发的技术变革

    C10K 问题引发的技术变革 http://rango.swoole.com/archives/381 C10K 问题 服务器应用领域很古老很出名的一个问题,大意是说单台服务器要同时支持并发 10K ...

  9. 常见的安装包制作程序installer

    1. Windows安装程序制作工具 NSISNSIS (Nullsoft Scriptable Install System) 是一个专业开源的制作 windows 安装程序的工具.http://n ...

  10. location 将多级目录下的文件转成一个文件

    /ck-135-201-7142.html 指向/ck/135/201/7142.html [root@web01 www]# cat /app/server/nginx/conf/rewrite/d ...