ZOJ 1013 Great Equipment(DP)
2013-04-15 14:04
302 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1013
采用动态规划解决。
设f
[x][y] 表示前n辆车装了x个装备1和y个装备2之后能装的最多的装备3的个数。
递推关系如下:
f
[x][y] = max ( f[n - 1][x - a][y - b] + c); 其中f[0][x][y]=0
其中a和b的范围为第n辆车可以装的装备1和装备2的个数, c 为第n辆车装完a个装备1和b个装备2后可以装的装备3的个数。
通过递推求得f
[x][y]后,可以遍历x和y(x,y的范围可以在上述递推的过程中得到)求得最终的结果。
由于f
只和f[n-1]有关,所以实际上 f 数组的第一维只需要2就可以(详见代码)
【版权声明】转载请注明出处 /article/4879574.html
采用动态规划解决。
设f
[x][y] 表示前n辆车装了x个装备1和y个装备2之后能装的最多的装备3的个数。
递推关系如下:
f
[x][y] = max ( f[n - 1][x - a][y - b] + c); 其中f[0][x][y]=0
其中a和b的范围为第n辆车可以装的装备1和装备2的个数, c 为第n辆车装完a个装备1和b个装备2后可以装的装备3的个数。
通过递推求得f
[x][y]后,可以遍历x和y(x,y的范围可以在上述递推的过程中得到)求得最终的结果。
由于f
只和f[n-1]有关,所以实际上 f 数组的第一维只需要2就可以(详见代码)
#include<iostream> #include<cstring> using namespace std; int min(int x ,int y) { return x<y? x:y; } int max(int x,int y) { return x>y? x:y; } int fun(int x) { return x>0? x:0; } int f[2][501][501]; int main() { int carNum,w1,s1,d1,w2,s2,d2,w3,s3,d3,c1,c2,c3,d4; int limit[101][2]; int count=1; cin>>carNum; while(carNum) { cin>>w1>>s1>>d1>>w2>>s2>>d2>>w3>>s3>>d3>>c1>>c2>>c3>>d4; for(int i=1;i<=carNum;i++) cin>>limit[i][0]>>limit[i][1]; int prev=0,now=1; int prev_max1=0,prev_max2=0,temp,n1,n2,n3; memset(f[0],0,sizeof(f[0])); for(int i=1;i<=carNum;i++) { memset(f[now],-1,sizeof(f[now])); n1=min(limit[i][0]/w1,limit[i][1]/s1); for(int a=0;a<=n1;a++) { n2=min( (limit[i][0]-a*w1)/w2, (limit[i][1]-a*s1)/s2 ); if(a==0)temp=n2; for(int b=0;b<=n2;b++) { n3=min( (limit[i][0]-a*w1-b*w2)/w3, (limit[i][1]-a*s1-b*s2)/s3 ); for(int h=0;h<=prev_max1;h++) for(int k=0;k<=prev_max2;k++) { if(f[prev][h][k]!=-1) f[now][h+a][k+b]=max( f[now][h+a][k+b], f[prev][h][k]+n3 ); } } } prev_max1+=n1; prev_max2+=temp; int pp=prev; prev=now; now=pp; }//for(int i=1;i<=carNum;i++) //结束后prev指向的数组存有结果; int result=0; for(int i=0;i<=prev_max1;i++) for(int j=0;j<=prev_max2;j++) { if(f[prev][i][j]!=-1) { int groupNum=65535; //max if(c1!=0) groupNum=min(i/c1,groupNum); if(c2!=0) groupNum=min(j/c2,groupNum); if(c3!=0) groupNum=min(groupNum,f[prev][i][j]/c3); result=max(result,fun(i-groupNum*c1)*d1+fun(j-groupNum*c2)*d2+fun(f[prev][i][j]-groupNum*c3)*d3+groupNum*d4); // 开始没有加fun函数,没有考虑到i-groupNum等小于0; } } if(count>1)cout<<endl<<endl; cout<<"Case "<<count++<<": "<<result; cin>>carNum; } return 0; }
【版权声明】转载请注明出处 /article/4879574.html
相关文章推荐
- ZOJ 1013 Great Equipment ---- DP
- ZOJ 1013 Great Equipment(DP)
- ZOJ 1013 Great Equipment (DP)
- Great Equipment - ZOJ 1013 dp
- poj 1013 great equipment(背包,dp)
- ZOJ 1013 Great Equipment
- ZOJ 1013 Great Equipment
- ZOJ 1013 Great Equipment
- zoj 1013 Great Equipment DP
- [DP] ZOJ1013、1027、1074
- zju 1013 Great Equipment(DP)
- zoj 1013 Great Equipment
- zoj 1013 Great Equipment
- [dp] zoj 3682 E - Cup 3
- zoj 1883 DP 开始刷大黄DP分类..
- ZOJ 3812 We Need Medicine(dp、背包、状态压缩、路径记录)
- zoj3296 Connecting the Segments,后缀数组、dp
- ZOJ 3256 Tour in the Castle 解题报告(插头DP)
- ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)
- ZOJ 3822 Domination 期望dp