hdu 01背包汇总(1171+2546+1864+2955。。。
1171
题意比较简单,这道题比较特别的地方是01背包中,每个物体有一个价值有一个重量,比较价值最大,重量受限,这道题是价值受限情况下最大,也就值把01背包中的重量也改成价值。
//Problem : 1171 ( Big Event in HDU ) Judge Status : Accepted #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std; int v[6000], dp[5000 * 50 + 10]; int main() {
//freopen("in.txt", "r", stdin);
int n;
int sum;
while (scanf("%d", &n) != EOF && n >= 0) {
memset(dp, 0, sizeof(dp));
int a, b;
sum = 0;
int idx = 0;
for (int i = 1; i <= n; i++) {
scanf("%d%d", &a, &b);
sum += a * b;
for (int j = 0; j < b; j++) {
v[++idx] = a;
}
}
for (int i = 1; i <= idx; i++)
for (int j = sum / 2; j >= v[i]; j--)
dp[j] = max(dp[j], dp[j - v[i]] + v[i]);
printf("%d %d\n", sum - dp[sum / 2], dp[sum / 2]);
}
return 0;
}
2546
和上面一样,没有重量,只有价值。
如果卡上不足5元,输出原值。如果大于5元,就在m-5范围内花最多的钱(留下最贵的菜),然后用剩下的钱减去最贵的菜。
代码
//Problem : 2546 ( 饭卡 ) Judge Status : Accepted
#include <iostream>
#include <algorithm>
using namespace std; int v[1005];
int dp[1005]; int main()
{
int n, m;
while (cin >> n && n) {
memset(dp, 0, sizeof(dp)); //又忘记初始化然后wa了一发。。。
for (int i = 1; i <= n; ++i) {
cin >> v[i];
}
cin >> m;
if (m < 5) {
printf("%d\n", m);
continue;
}
sort(v + 1, v + n + 1);
for (int i = 1; i < n; ++i) {
for (int j = m - 5; j >= v[i]; j--)
dp[j] = max(dp[j], dp[j - v[i]] + v[i]);
}
printf("%d\n", m - dp[m - 5] - v[n]);
} return 0;
}
2602
水题,不写了。基本01背包。
1864
题意很简单,做法也很简单,全部*100变成整数然后01背包。
一处(int)(q*100)不小心写成了(int)q*100调试了好久才找到,蠢蠢蠢= =
//Problem : 1864 ( 最大报销额 ) Judge Status : Accepted /**< hdu 1864 */
#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; double pri[35]; //合法发票的价格
int pric[35];
int dp[35 * 1000 * 100]; int main()
{
double q;
int n, m;
double pri_a, pri_b, pri_c;
while (scanf("%lf%d", &q, &n) != EOF && n) {
int idx = 0;
for (int i = 0; i < n; ++i) {
cin >> m;
pri_a = pri_b = pri_c = 0;
char ch;
double price;
int ok = 1;
for (int j = 0; j < m; ++j) {
scanf(" %c:%lf", &ch, &price);
switch(ch) {
case 'A' :
pri_a += price;
break;
case 'B' :
pri_b += price;
break;
case 'C' :
pri_c += price;
break;
default: ok = 0;
}
}
double sum = pri_a + pri_b + pri_c;
//printf("a=%f,b=%f,c=%f,sum=%f\n", pri_a, pri_b, pri_c, sum);
if (!(pri_a > 600 || pri_b > 600 || pri_c > 600 || sum > 1000) && ok) pri[++idx] = sum;
} //end for 求出pri[] for (int i = 1; i <= idx; i++) {
pric[i] = (int)(pri[i] * 100);
} memset(dp, 0, sizeof(dp));
for (int i = 1; i <= idx; ++i) {
for (int j = (int)(q * 100); j >= pric[i]; --j) {
dp[j] = max( dp[j], dp[j - pric[i]] + pric[i]);
}
}
printf("%.2f\n", dp[(int)(q * 100)] / 100.00);
}
return 0;
}
这题也可以换一种方法做,用张数当背包。
我们平时的背包都是质量,当数据过大,或像这个一样是实数,可以转换思维,用价值当背包等。
//Problem : 1864 ( 最大报销额 ) Judge Status : Accepted #include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; double pri[35];
double dp[35]; int main()
{
double q;
int n, m;
double pri_a, pri_b, pri_c;
while (scanf("%lf%d", &q, &n) != EOF && n) {
int idx = 0;
for (int i = 0; i < n; ++i) {
cin >> m;
pri_a = pri_b = pri_c = 0;
char ch;
double price;
int ok = 1;
for (int j = 0; j < m; ++j) {
scanf(" %c:%lf", &ch, &price);
switch(ch) {
case 'A' :
pri_a += price;
break;
case 'B' :
pri_b += price;
break;
case 'C' :
pri_c += price;
break;
default: ok = 0;
}
}
double sum = pri_a + pri_b + pri_c;
//printf("a=%f,b=%f,c=%f,sum=%f\n", pri_a, pri_b, pri_c, sum);
if (!(pri_a > 600 || pri_b > 600 || pri_c > 600 || sum > 1000) && ok) pri[++idx] = sum;
} //end for 求出pri[] for (int i = 0; i <= idx; i++) {
dp[i] = 0.0;
} for (int i = 1; i <= idx; ++i) {
for (int j = idx; j >= 1; --j) {
if (dp[j - 1] + pri[i] <= q)
dp[j] = max(dp[j], dp[j - 1] + pri[i]);
}
}
double ans = 0;
for (int i = 1; i <= idx; ++i)
if (ans < dp[i]) ans = dp[i];
printf("%.2f\n", ans);
}
return 0;
}
2955
又是一道不是整数的题,可以看出这道题不能像上一道那样简答的通过x100完成,因为精度不够。
可以把概率当背包,这题还有一处不同就是不是加,概率是乘
//Problem : 2955 ( Robberies ) Judge Status : Accepted #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; double P[105]; //每一家银行不被抓的概率
int M[105]; //每一家银行偷到的钱...
double dp[10005]; int main()
{
int t;
cin >> t;
while (t--) {
int n;
int sum = 0;
double p;
cin >> p >> n;
for (int i = 1; i <= n; ++i) {
cin >> M[i] >> P[i];
P[i] = 1 - P[i];
sum += M[i];
}
memset(dp, 0, sizeof(dp));//又特么忘了这句wa一发。。。
dp[0] = 1; //不偷时不被抓概率是1
for (int i = 1; i <= n; ++i) {
for (int j = sum; j >= M[i]; --j) {
dp[j] = max(dp[j], dp[j - M[i]] * P[i]); //不被抓的概率最大
}
}
for (int i = sum; i >= 0; --i)
if (dp[i] > 1 - p) {
printf("%d\n", i);
break;
}
}
return 0;
}
hdu 01背包汇总(1171+2546+1864+2955。。。的更多相关文章
- 1171 Big Event in HDU 01背包
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1171 题意:把商品分成两半,如不能均分,尽可能的让两个数相接近.输出结果:两个数字a,b且a>=b. ...
- HDU 1171 Big Event in HDU(01背包)
题目地址:HDU 1171 还是水题. . 普通的01背包.注意数组要开大点啊. ... 代码例如以下: #include <iostream> #include <cstdio&g ...
- hdu 1171 Big Event in HDU (01背包, 母函数)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1171 Big Event in HDU(01背包)
题目链接 题意:给出n个物品的价值v,每个物品有m个,设总价值为sum,求a,b.a+b=sum,且a尽可能接近b,a>=b. 题解:01背包. #include <bits/stdc++ ...
- hdu 0-1背包
题目地址http://acm.hdu.edu.cn/showproblem.php?pid=2602 #include <stdio.h> #include <string.h> ...
- Big Event in HDU(01背包)
/* 题意: 输入一个数n代表有n种物品, 接下来输入物品的价值和物品的个数: 然后将这些物品分成A B 两份,使A B的价值尽可能相等也就是尽量分的公平一些,如果无法使A B相等,那么就使A多一些: ...
- HUD 1171 Big Event in HDU(01背包)
Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...
- hdu1171Big Event in HDU(01背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu 2955 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...
随机推荐
- JavaScript decodeURI() 和 encodeURI() 函数
定义和用法 decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码. 语法 decodeURI(URIstring) 参数 描述 URIstring 必需.一个字符串 ...
- C#<热血传奇>服务端源代码再次给力更新
前段时间一直在忙公司项目,最近抽点空稍微把部分代码重新整理一下(代码太久没碰很多地方都忘记了 囧~~~) 此次还是更新服务端,并修正上一版里面存在的很多指针 异常BUG... (代码比较烂,还请各位 ...
- 如何组织css,写出高质量的css代码
!如何组织css一:css的API 属于基础部分,这部分的能力用“对”和“错”来评判. 比如说把文字设置为红色,只能用color:red:这种写法是对的,其他任何写法都是错的. 二:css框架 不能用 ...
- Tomcat 性能调优 出现java.lang.OutOfMemoryError: PermGen space
Tomcat 在部署应用中,Server报错:java.lang.OutOfMemoryError: PermGen space,问题就是Tomcat内存分配的太小了. 解决办法 1: 修改Tomca ...
- 朴素贝叶斯文本分类java实现
package com.data.ml.classify; import java.io.File; import java.util.ArrayList; import java.util.Coll ...
- shell中的内建命令, 函数和外部命令
转自shell中的内建命令, 函数和外部命令 Shell识别三种基本命令:内建命令.Shell函数以及外部命令: (1)内建命令就是由Shell本身所执行的命令. 有些命令是由于其必要性才内建的 ...
- Nagios 邮箱告警的方式太OUT了!
一般来讲,在安装完 Nagios 后,我们做的第一件最正确的事,就是设置它的邮件通知,对吧.因为如果没有这一步骤的话,你怎么能够知道什么时候会出现问题呢? 伴随着成功的初始安装,你即将是你司唯一一个能 ...
- 李洪强漫谈iOS开发[C语言-021]-运算符
- Hibernate的优缺点
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDB ...
- vc:如何从Internet上有效而稳定地下载文件
http://www.vckbase.com/index.php/wv/172 如何从Internet上有效而稳定地下载文件 ,这是很多网络应用程序要考虑的重要问题,本文提供的代码段针对这个问题进行了 ...