cdoj31-饭卡(card) (01背包)
2015-06-28 11:19
369 查看
http://acm.uestc.edu.cn/#/problem/show/31
Submit Status
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。
第一行为正整数n,表示菜的数量。n≤1000。
第二行包括n个正整数,表示每种菜的价格。价格不超过50。
第三行包括一个正整数m,表示卡上的余额。m≤1000。
n=0表示数据结束。
题解:01背包。单独取出序列中最大值,然后对剩下的数进行01背包,V为m-5,求得maxValue,最后与序列最大值做减法。
代码:
饭卡(card)
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)Submit Status
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。
Input
多组数据。对于每组数据:第一行为正整数n,表示菜的数量。n≤1000。
第二行包括n个正整数,表示每种菜的价格。价格不超过50。
第三行包括一个正整数m,表示卡上的余额。m≤1000。
n=0表示数据结束。
Output
对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。Sample input and output
Sample Input | Sample Output |
---|---|
1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0 | -45 32 |
代码:
#include <fstream> #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N=1005; int n,v; int a ,dp ; int main() { //freopen("D:\\input.in","r",stdin); //freopen("D:\\output.out","w",stdout); while(scanf("%d",&n),n){ int m0=0,i0=0; for(int i=0;i<n;i++){ scanf("%d",&a[i]); if(m0<a[i]) m0=a[i],i0=i; } scanf("%d",&v); if(v<5){ printf("%d\n",v); continue; } v-=5; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++){ if(i==i0) continue; for(int j=v;j>=a[i];j--) dp[j]=max(dp[j],dp[j-a[i]]+a[i]); } printf("%d\n",v+5-dp[v]-m0); } return 0; }
相关文章推荐
- 分支-11~~~分支-15
- 《般若波罗蜜多心经》白话文翻译版本
- dubbo 启动:无法读取方案文档 'http://code.alibabatech.com/sch,原因为 1) 无法找到文档; 2) 无法读取文档; 3) ...
- spring整合struts小结
- WPF编程学习——动画
- 常用bat文件
- JavaScript 语句分号的必要性
- 外观模式
- ImportError: No module named ...
- Codeforces #310 div2 C. Case of Matryoshkas
- C#操作Access通用类实例
- 剑指offer 66-矩阵中的路径
- Unity性能优化
- 测试Theano_LSTM的Tutorial例子
- iOS 集成环信, 扩展属性, chatcell label 可被点击
- 初识Mybatis
- 去除 Git 安装后的右键菜单
- Java-J2SE学习笔记-树状展现文件结构
- 分支-06~~~分支-10
- Mongodb在Windows下安装及配置