直到做了EOJ3544“小迷妹在哪”
我才意识到我一直都把01背包中dp数组的含义理解错了
我之前一直以为一个容量为10的背包,dp[10]表示的是背包为空的状态,dp[0]表示的是没有空间的状态;
因为之前做的题对这个方向没有实际的差别,就一直没发现这个错误,直到这道题。
这道题把背包剩余空间作为了价值的一部分,因此就有了方向上的差别,如果理解错了就会wa
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,T;
struct per
{
int a,t;
bool operator<(const per&c)const{
return a*c.t>t*c.a;
}
}p[100010];
int dp[310];
int main()
{
scanf("%d %d",&n,&T);
for(int i=0;i<n;i++){
scanf("%d %d",&p[i].a,&p[i].t);
}
sort(p,p+n);
memset(dp,0,sizeof(dp));
int ans = 0;
for(int i=0;i<n;i++){
for(int v = T;v>=p[i].t;v--){
dp[v] = max(dp[v],dp[v-p[i].t]+(T-v)*p[i].a); //差别就在这个地方
ans = max(ans,dp[v]);
}
}
printf("%d\n",ans);
return 0;
}
dp[v]表示的应当是已经使用了v空间,而不是剩余空间是v
另外这道题还需要注意的是,需要对物品进行性价比排序,即
bool operator<(const per&c)const{
return a*c.t>t*c.a;
}