HDU2955-动态规划-求二维解法

Raise 2014-02-19 05:12:19
http://acm.hdu.edu.cn/showproblem.php?pid=2955
RT,为什么我用一维的DP就可以AC,而稍稍改成二维数组形式,就WA了呢?求各路大神给点提示!!!!
一维AC代码如下:
#include <iostream>
using namespace std;

//dp[i][j] = p, 从前i bank抢j money 不被抓的最大概率p
//dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost[i]]*(1-rp))
//前边i-1个银行不被抓的概率dp[i-1][j-cost[i]],第i个银行
//不被抓的概率1-rp,前i个银行不被抓的概率为两者相乘

double dp[11111]; //max p
double p[111]; //was caught
int cost[111];
double limitp; //limit p
int N; //N bank
int sum; //max money

void DP()
{
memset(dp,0,sizeof(dp));
int i, j;
dp[0] = 1.0; //抢劫0元,不被抓的概率是1
for ( i = 1; i <=N; ++i )
{
for ( j = sum; j >=cost[i]; --j )
{
dp[j] = max(dp[j], dp[j-cost[i]]*(1-p[i]));
}
}

for (j=sum; j >= 0; --j)
{
if (dp[j] > (1.0-limitp))
{
cout << j << endl;
return;
}
}
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("2.txt","r",stdin);
#endif
int T,i;
cin >> T;
while (T--)
{
sum = 0;
cin >> limitp >> N;
for ( i = 1; i <= N; ++i )
{
cin >> cost[i] >> p[i];
sum += cost[i];
}
DP();
}
return 0;
}

二维WA代码,求解哪里WA了。
#include <iostream>
using namespace std;

//dp[i][j] = p, 从前i bank抢j money 不被抓的最大概率p
//dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost[i]]*(1-rp))
//前边i-1个银行不被抓的概率dp[i-1][j-cost[i]],第i个银行
//不被抓的概率1-rp,前i个银行不被抓的概率为两者相乘

double dp[111][11111]; //max p
double p[111]; //was caught
int cost[111];
double limitp; //limit p
int N; //N bank
int sum; //max money

void DP()
{
memset(dp,0,sizeof(dp));
int i, j;
for (i=0; i <= N; ++i)
dp[i][0] = 1.0; //抢劫0元,不被抓的概率是1
for ( i = 1; i <=N; ++i )
{
for ( j = sum; j >=cost[i]; --j )
{
dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost[i]]*(1-p[i]));
}
}

for (j=sum; j >= 0; --j)
{
for(i=1; i <= N; ++i)
{
if (dp[i][j] > (1.0-limitp))
{
cout << j << endl;
return;
}
}
}
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("2.txt","r",stdin);
#endif
int T,i;
cin >> T;
while (T--)
{
sum = 0;
cin >> limitp >> N;
for ( i = 1; i <= N; ++i )
{
cin >> cost[i] >> p[i];
sum += cost[i];
}
DP();
}
return 0;
}
...全文
358 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Raise 2014-02-21
  • 打赏
  • 举报
回复
引用 3 楼 FancyMouse 的回复:
[quote=引用 2 楼 leolinsheng 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] for (j=sum; j >= 0; --j) { for(i=1; i <= N; ++i) { if (dp[i][j] > (1.0-limitp)) { cout << j << endl; return; } } } 你只能查i==N那一行看有什么j满足要求,而不能看所有行的j
但是,改成只求查i==N那一行,第一个样例就过不去了[/quote] j<cost[i]的时候你要让dp[i][j] = dp[i-1][j];[/quote]十分感谢,问题已经解决,结贴。
FancyMouse 2014-02-21
  • 打赏
  • 举报
回复
引用 2 楼 leolinsheng 的回复:
[quote=引用 1 楼 FancyMouse 的回复:] for (j=sum; j >= 0; --j) { for(i=1; i <= N; ++i) { if (dp[i][j] > (1.0-limitp)) { cout << j << endl; return; } } } 你只能查i==N那一行看有什么j满足要求,而不能看所有行的j
但是,改成只求查i==N那一行,第一个样例就过不去了[/quote] j<cost[i]的时候你要让dp[i][j] = dp[i-1][j];
Raise 2014-02-20
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
for (j=sum; j >= 0; --j) { for(i=1; i <= N; ++i) { if (dp[i][j] > (1.0-limitp)) { cout << j << endl; return; } } } 你只能查i==N那一行看有什么j满足要求,而不能看所有行的j
但是,改成只求查i==N那一行,第一个样例就过不去了
FancyMouse 2014-02-20
  • 打赏
  • 举报
回复
for (j=sum; j >= 0; --j) { for(i=1; i <= N; ++i) { if (dp[i][j] > (1.0-limitp)) { cout << j << endl; return; } } } 你只能查i==N那一行看有什么j满足要求,而不能看所有行的j
随着通信电子技术的迅速发展,信息技术给家居行业产生了深远的影响,家居环境的智能化监控已经成为智能家居的一个重要的发展方向。人们逐渐对自己的生活提出一种更高的要,他们需要一种智能化、可交互,并且融合现代创新科技的产品来改善他们的生活环境,使他们生活更加安全、舒适、便捷、智能。本文根据智能家居的发展背景和研究现状,并且从实用性和可行性角度出发,研究设计了一种基于STM32单片机的智能家居系统。该系统由一个多功能综合的技术系统组成,各个多功能子系统间具有协同配合能力。基于STM32单片机实现的功能子系统包括:智能温度检测,智能湿度检测,智能烟雾/火灾检测智能检测,无线传输,人机交互机构,风扇调节,报警模块。 整个系统分为前端51单片机采集板和后端STM32单片机接收板。 采集板使用DHT11温湿度传感器、MQ烟雾传感器完成室内家居环境的采集。然后通过nRFL24L01将采集到的数据发送给后端。接收板使用LCD1602完成数据显示、使用蜂鸣器模块报警,使用风扇驱动模块调节室内家居环境。本文完成了智能家居控制系统前端、后端软硬件的设计,使用Altium designer绘制了电路原理图,使用Keil C完成了51单片机和STM32单片机的编程与调试。 最后,对本文设计的基于STM32的智能家居控制系统进行部署调试。试验结果表明,该系统可成功应用在智能家居环境检测调节和火灾安全防护的领域,可提高家居生活智能化水平。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧