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;
}
...全文
256 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

64,649

社区成员

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

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