题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=13

很经典的一个DP的题目

定义dp[i][num1][num2]表示前i个车装num1个装备1和num2个装备2之后最多能装的装备3的个数

那么dp[i][p+x][q+y]=max(dp[i][p+x][q+y],dp[i-1][p][q]+num(x,y));

其中num(x,y)表示第i辆车装x个装备1和y个装备2后还能最多装的装备3的个数

x,y的范围即为第辆车的可以装的装备1和装备2的最大个数

可以看出dp[i]只与dp[i-1]有关,要用滚动数组,否则会超内存

代码:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#define maxn 550
#define maxn_1 110
using namespace std;
int dp[][maxn][maxn];
int w[maxn_1];
int s[maxn_1];
int w1,s1,d1;
int w2,s2,d2;
int w3,s3,d3;
int c1,c2,c3,d4;
int prev,now;
int put(int num,int p,int q)
{
int nw=(w[num]-p*w1-q*w2)/w3;
int ns=(s[num]-p*s1-q*s2)/s3; return min(nw,ns);
}
int main()
{
int n;
int icase=;
while(scanf("%d",&n) != EOF&& n)
{
scanf("%d%d%d",&w1,&s1,&d1);
scanf("%d%d%d",&w2,&s2,&d2);
scanf("%d%d%d",&w3,&s3,&d3);
scanf("%d%d%d",&c1,&c2,&c3);
scanf("%d",&d4); for(int i=;i<=n;i++)
scanf("%d%d",&w[i],&s[i]);
memset(dp[],,sizeof(dp[])); int max_1=;
int max_2=;
prev=,now=;
for(int i=;i<=n;i++)
{
memset(dp[now],-,sizeof(dp[now]));
int num1=min(w[i]/w1,s[i]/s1);
int tmp;
for(int p=;p<=num1;p++)
{
int num2=min((w[i]-p*w1)/w2,(s[i]-p*s1)/s2);
if(p==) tmp=num2; for(int q=;q<=num2;q++)
{
int nn=put(i,p,q);
for(int k1=;k1<=max_1;k1++)
for(int k2=;k2<=max_2;k2++)
{
if(dp[prev][k1][k2]!=-)
dp[now][k1+p][k2+q]=max(dp[now][k1+p][k2+q],dp[prev][k1][k2]+nn);
}
}
} max_1+=num1;
max_2+=tmp;
swap(now,prev); }
int ans=;
for(int i=;i<=max_1;i++)
for(int j=;j<=max_2;j++)
{
if(dp[prev][i][j]!=-)
{
int num_4=min(min(i/c1,j/c2),dp[prev][i][j]/c3);
ans=max(max(ans,i*d1+j*d2+dp[prev][i][j]*d3),(i-num_4*c1)*d1+(j-num_4*c2)*d2+(dp[prev][i][j]-num_4*c3)*d3 +num_4*d4);
}
}
if(icase++) cout<<endl;
cout<<"Case "<<icase<<": "<<ans<<endl;
}
return ;
}

最新文章

  1. mac svn命令使用
  2. aspx后台传递Json到前台的两种接收方法
  3. 七牛图片上传JSSDK
  4. ecshop 支付
  5. Linq to entities 学习笔记
  6. java.util.TimeZone 新加方法 getTimeZone(ZoneId zoneId) 导致的问题
  7. 7月13日微软MVP社区夏日巡讲北京站活动现场图集
  8. Codeforces Gym 100733H Designation in the Mafia flyod
  9. Oracle MySQL Server 安全漏洞
  10. MySQL常见错误类型
  11. 【Javascript&amp;Jquery基础归纳】- 加载相关
  12. HDU-1176(基础方程DP)
  13. SuperSocket源码解析之启动过程
  14. ThinkPHP 的模型使用详细介绍--模型的核心(七)
  15. php nginx反向代理
  16. 关于RequestDispatcher的原理
  17. java做图片点击文字验证码
  18. WebService简单搭建和调用
  19. 使用Quartz实现定时任务
  20. Can’t call setState (or forceUpdate) on an unmounted component 警告处理方法

热门文章

  1. 创建keystone的catalog时提示:‘Internal Server Error (HTTP 500)’
  2. iOS面试必看经典试题分析
  3. Ceres Solver for android
  4. Android中那些有你不知道的事
  5. Snapman设计中的思考
  6. 裴波那序列-JAVA实现
  7. 安卓 ADB常见问题整理
  8. SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除临时表(drop table #tableName)吗?
  9. php基础知识(二)---2017-04-14
  10. CGLIB和JDK代理