0-1背包问题,hdu_2546_饭卡 问题
来源:互联网 发布:淘宝网太极鞋 编辑:程序博客网 时间:2024/04/27 15:32
这道题不算难,即使是对于一个刚刚开始研究acm的人来说仔细分析后也能有所想法。本人刚刚开始acm之路不久,通过查资料,知道这是一道背包问题,而且是最简单的0-1背包问题,资料来源于WIKI百科http://zh.wikipedia.org/zh-cn/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98。
这道题的思路是:首先,当钱m<5的时候,肯定买不了东西,当m=5的时候,肯定是m-pr(最贵)。(pr是菜的价格)。
其次,想一下,怎么才能让剩的钱最最少呢?如果是用m减去最贵的再减去次贵的,那么当m<5的时候输出????这是不对的!!正确的想法是:将你的钱m减去菜的价格一直减到m最接近5,然后用这个最接近5的m减去最贵的。————所以,将m-5当作是背包的最大容量,将最贵的菜拿出来(最后还得用它呢),剩下菜的价格就是往里边塞得东西。最后输出m-dp[m-5]-pr(最贵)!!
#include <iostream>#include <cstdio>#include <algorithm>#include <memory.h>#define max(a,b) ((a)>=(b)?(a):(b))using namespace std;int N;int m;int dp[50000];int main(){ while(scanf("%d",&N)!=EOF&&N!=0){ int pr[1100]; for(int i=0;i<N;i++){ scanf("%d",&pr[i]); } sort(pr,pr+N); scanf("%d",&m); if(m<5) printf("%d\n",m); else if(m==5) printf("%d\n",m-pr[N-1]); else{ memset(dp,0,sizeof(dp)); for(int i=0;i<N-1;i++){ for(int j=m-5;j>=pr[i];j--){ dp[j]=max(dp[j],dp[j-pr[i]]+pr[i]); } } printf("%d\n",m-dp[m-5]-pr[N-1]); } } return 0;}
- 0-1背包问题,hdu_2546_饭卡 问题
- hdu_2546_饭卡(01背包)
- hdu_2546_饭卡(01背包)
- HDU_2546_饭卡(动态规划_01背包)
- 饭卡(0 1 背包问题)
- 背包问题和0-1背包问题
- 背包问题和0-1背包问题
- 背包问题系列--"0-1背包问题"
- 背包笔记-含0/1背包问题、完全背包问题、多重背包问题、二维背包问题、分组背包问题
- 0-1背包问题
- 0/1背包问题
- 0,1背包问题
- 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- // 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- 【XE5-IndyDB -6】 TIdDBQuery 组件
- 2054 Color a Tree 贪心
- 应该在什么时候使用Hadoop
- Java构造和解析Json数据的两种方法详解二
- 设计模式系列6-工厂模式
- 0-1背包问题,hdu_2546_饭卡 问题
- 笔试题--“good and abc”
- Oracle之实战(图书管理系统)
- 拉格朗日插值公式详解
- Java内存管理机制
- Extjs API无法打开
- Activity的四种launchMode
- Jackson 框架,轻易转换JSON
- QWidget添加背景