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。。。的更多相关文章

  1. 1171 Big Event in HDU 01背包

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1171 题意:把商品分成两半,如不能均分,尽可能的让两个数相接近.输出结果:两个数字a,b且a>=b. ...

  2. HDU 1171 Big Event in HDU(01背包)

    题目地址:HDU 1171 还是水题. . 普通的01背包.注意数组要开大点啊. ... 代码例如以下: #include <iostream> #include <cstdio&g ...

  3. 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 ...

  4. HDU 1171 Big Event in HDU(01背包)

    题目链接 题意:给出n个物品的价值v,每个物品有m个,设总价值为sum,求a,b.a+b=sum,且a尽可能接近b,a>=b. 题解:01背包. #include <bits/stdc++ ...

  5. hdu 0-1背包

    题目地址http://acm.hdu.edu.cn/showproblem.php?pid=2602 #include <stdio.h> #include <string.h> ...

  6. Big Event in HDU(01背包)

    /* 题意: 输入一个数n代表有n种物品, 接下来输入物品的价值和物品的个数: 然后将这些物品分成A B 两份,使A B的价值尽可能相等也就是尽量分的公平一些,如果无法使A B相等,那么就使A多一些: ...

  7. HUD 1171 Big Event in HDU(01背包)

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...

  8. hdu1171Big Event in HDU(01背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. hdu 2955 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...

随机推荐

  1. Oracle11g用户密码过期

    今天一早来了,发现部署的网站访问报500,看日志,显示数据库连不上.然后我用sqldeveloper登录同样登不上,于是想到了之前碰到过的一个问题,Oralce11g的新特性:密码180天自动过期.随 ...

  2. 换一换js

    (function(){ var tit = $("#changes"), con = $("#wday>ul"), page = con.length, ...

  3. CSS3制作下拉菜单

    导航菜单其实是没有什么可说的,制作方法到处可见,今天这个案例本来不只是一个导 航,还有一个搜索表单的,可是为了偷懒,把搜索表单部分去掉了,就变成了一个CSS3 制作的下拉菜单.在这个导航中主要两点,一 ...

  4. hex(x) 将整数x转换为16进制字符串

    >>> a = 122 >>> b = 344 >>> c = hex(a) >>> d = hex(b) >>&g ...

  5. ORMBase对象/关系型数据库映射在MVC中的应用

    ORM这个字眼在我们操作数据库的时候,是我们使用频率最高的.它到底是个什么东西呢,我们先来看看一些对它的含义解释. 对象/关系数据库映射(object/relational mapping(ORM)) ...

  6. QT使用UAC(经过验证)

    网上有很多manifest的版本,mingw与vs系列也有不同的解决方案,不管那么多,我是使用这篇文章解决这个问题的: So it turns out that I had another bug t ...

  7. RUST叫系统编程语言,而GO是网络编程语言

    用GO你必须要搞清楚一点,GO不是面向CPU密集计算的,而是面向IO密集计算的!!!RUST才是面向CPU密集计算的语言,所以RUST叫系统编程语言,而GO是网络编程语言.GO跟JAVA的Spring ...

  8. 132. Palindrome Partitioning II

    题目: Given a string s, partition s such that every substring of the partition is a palindrome. Return ...

  9. 【Linux远程管理】Telnet远程连接管理

    Telnet,命令行界面下的远程管理工具,因为其历史非常悠久,几乎所有的操作系统都有该工具, 但是,Telnet在传输数据是是通过明文传输的,没有加密,所以现在几乎不会使用Telnet进行管理了. ( ...

  10. 浏览器助手,请求拦截,后台模拟键鼠操作,页内嵌入JS

    http://www.cnblogs.com/ /// <summary>        /// 网页浏览器助手        /// 请求拦截,后台模拟键鼠操作,页内嵌入JS       ...