这一题我一见,就感觉它是依赖背包,自己好不容易写好了,提交果断超时,这一超时,直接让我的思维陷入了混乱,没办法,只好求助于同学,只用了个01背包,我是这样理解的,也就是每个状态对应每箱做装与不装选择
代码如下,代码最好立即
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
#define MAXV 100008
int d[MAXV],dp[MAXV];
int main(){
int N,V;
int i,j,vb,n,c,w,v;
while(cin>>N>>V){
memset(dp,0,sizeof(dp));
memset(d,0,sizeof(d));
for(i=0;i<N;i++){
cin>>vb>>n;
for(j=0;j<=V-vb;j++)dp[j+vb]=d[j];
//要装这箱东西
for(j=0;j<n;j++){
cin>>c>>w;
for(v=V;v>=c+vb;v--)//01背包
dp[v]=max(dp[v],dp[v-c]+w);
}
for(j=0;j<=V;j++)
d[j]=max(d[j],dp[j]);
}
cout<<d[V]<<endl;
}
}
上周一直都在做背包,在做这次背包训练时,感觉到自己以前学的是多么浅呀,哎,弱!!!