hdu 2546 典型01背包
来源:互联网 发布:网络贷款不还会判刑么 编辑:程序博客网 时间:2024/06/05 08:21
分析:每种菜仅仅可以购买一次,但是低于5元不可消费,求剩余金额的最小值问题。。其实也就是最接近5元(>=5)时, 购买还没有买过的蔡中最大值问题,当然还有一些临界情况
1、当余额充足时,可以随意购买菜,即∑p - max_p +5 <= m 时,re = m - ∑p
2、当余额不充足时,有一种特殊情况,不能消费的情况,即m<5时 re = m;
3、余额不足时,只能购买部分菜,转化成01背包问题,找出最接近最接近5的值,
状态转换方程:
f[0][P] = true;f[0][0..P-1]=false;
f[i][p] = f[i-1][p+pi] 如果i-1个菜后余额p+pi、 第 i 个菜后余额p
具体做法:先对菜价格从小到大排序,从前往后根据最有子结构求出各个菜(价格最大的max除外,因为结果一定会减去max值)余额剩余情况,找到最接近5的金额,减去max值就是最佳答案
//hdu 2546 典型01背包 288 KB 31 ms #include<iostream>#include<algorithm>using namespace std;bool my[1001];//统计余额情况int main(){ int n,c[1001],m; while(cin >> n) { int i,j,k,s,re; if(!n)break; for(s=0,i=1; i<=n; i++) { cin >> c[i];s+=c[i]; } sort(c+1,c+n+1);// 不包括c[n+1] //for(i=1;i<=n;i++)cout << c[i]; cin >> m; if(s-c[n] <= m-5 ) re = m-s; else if(m < 5) re = m; else{//01背包 for(i=0; i<=m; i++)my[i]=false; my[m]=true; for(i=1; i<n; i++) for(j=5; j+c[i]<=m; j++) if(my[j+c[i]])my[j]=true; for(i=5;i<=m;i++) if(my[i])break; re = i-c[n]; } cout << re << endl; } return 0;}
- hdu 2546 典型01背包
- hdu 2191-wust9(多重背包典型)
- hdu 2546 01背包
- hdu 2546 01背包
- HDU 2546 01背包
- hdu 2546(01背包)
- 背包入门 01背包 hdu 2546
- hdu1171 Big Event in HDU(典型多重背包)
- POJ3624 Charm Bracelet(典型01背包问题)
- hdu 2546 饭卡 01背包
- hdu 2546 饭卡 (01背包)
- HDU 2546 饭卡(01背包)
- HDU 2546 饭卡 01背包
- HDU 2546 饭卡(01背包)
- hdu 2546 饭卡 (01背包)
- hdu 2546(01背包)
- hdu-2546 饭卡 01背包
- HDU 2546 饭卡(01背包)
- 关于c语言的一个小bug(c专家编程)
- Uva 12585 Poker End Games 概率与期望
- 分页类代码实现
- hdu 1159 Palindrome(回文串) 动态规划
- Windons下读取两个文件中的信息,进行比对(附代码)
- hdu 2546 典型01背包
- java设计模式示例
- hdu 1081 矩阵最大连续子序列
- Populating Next Right Pointers in Each Node
- 把输入的字符串中,每个单词的首字母变成大写(单词用空格隔开)
- 集群的负载均衡技术
- A10 平板开发二搭建Android开发环境
- q3explore
- 据说这块板子最近很火哦!