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是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...
随机推荐
- C#并行和多线程编程_(1)认识Parallel
Parallel: 英 [ˈpærəlel] 美 [ˈpærəˌlɛl] ,并联的,并行的. 随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性 ...
- 用android-x86模拟器不能运行程序错误Tag:libc的问题
如果用的是x86的android模拟器,运行软件时一闪就关闭logcat中:类似:Fatal signal 11 (SIGSEGV) at 0x00000078 (code=1), thread 16 ...
- C# - 中断模式下的调试
1. 设置断点 选中需要设置断点的行,右键选择断点插入断点,此行左侧显示红色圆形标志.或者F9 有几个条件断点类型: a. 条件断点 b. 命中次数,大于,几倍于,大于等于你设置的断点次数此时中断 c ...
- collectionView布局原理及瀑布流布局方式--备用
最近学习到了瀑布流的实现方法,瀑布流的实现方式有多种,这里应用collectionView来重写其UICollectionViewLayout进行布局是最为简单方便的.但再用其布局之前必须了解其布局原 ...
- 关于http客户端常见错误"警告:Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is rec"
在开发过程中,经常得写http客户端测试接口服务,今天在使用过程中出现了这样的一个警告: 警告: Going to buffer response body of large or unknown s ...
- Ubuntu14.04强化之conky——Harmattan主题
一共有17个主题,四种模式,两种天气模式,支持摄氏度和华氏度. This conky comes with 17 themes: Cards Elementary Elune Flatts Metro ...
- 互联网科技今年九个兴奋点:O2O深耕细作,可穿戴设备分水岭
http://new.iheima.com/detail/2014/0204/58374.html i黑马观察到,2014年是O2O的深耕细作年,而线上和线下结合这一互联网化趋势,将会向更多产业扩散, ...
- 网络编程(二)NSURLSessionConfiguration
1.NSURLSession有三种工作模式 (1)defaultSessionConfiguration(默认):使用的是基于磁盘缓存的持久化策略,Cache,Cookie. (2)ephemeral ...
- cocos2d-html5 Layer 和 Scene 创建模式
var myLayer = cc.Layer.extend({ init:function() {//2 界面 var bRet = false; if (this._super()) { bRet ...
- Java集合类之HashMap
package com.test; import java.util.*; public class Demo7_3 { public static void main(String[] args) ...