用类似0-1背包的做法怎么不行

分别用m[50],p[50],r[50]来存储题的分数、每分钟减少的分数、花费的时间;就可以开始打表了;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=T;j++)
{
if(j>=r[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-r[i]]+(m[i]-j*r[i]));
else
dp[i][j]=dp[i-1][j];
}
}
这样怎么不行,dp[i][j]的意思是有i个题在j时间里的最大分数;
下面是我都完整代码
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int dp[50][1000000];
int main()
{
int N,T;
cin>>N>>T;
int m[50],p[50],r[50];//题的分数、每分钟减少的分数、花费的时间
for(int i=1;i<=N;i++)
cin>>m[i];
for(int i=1;i<=N;i++)
cin>>p[i];
for(int i=1;i<=N;i++)
cin>>r[i];
memset(dp,0,sizeof(dp));
for(int i=1;i<=N;i++)
{
for(int j=1;j<=T;j++)
{
if(j>=r[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-r[i]]+(m[i]-j*r[i]));
else
dp[i][j]=dp[i-1][j];
}
}
cout<<dp[N][T]<<endl;
return 0;
}
全部评论
原理错了 ,0-1背包只能决定用哪几个而不能决定顺序,但是这题要求顺序。你这样从1到N循环永远是按照先第一题、第二题然后第三题的顺序(0-1背包只能决定抛弃中间某一道题而不能让后面的题先做)
1 回复
分享
发布于 2020-02-12 17:07
显然不行啊实例三挂了
点赞 回复
分享
发布于 2019-11-11 19:34
滴滴
校招火热招聘中
官网直投

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务