F[i][j]表示总重量为i,最上面那个盒子中糖果种类为j的方案数

每次新加一个盒子,或者在原来盒子中加入一个糖

F[i][0]为中间状态,优化转移(表示最上面那个盒子不能加糖果)

  

#include<cstdio>
#include<algorithm>
using namespace std;
int d[1000005],w[1000005],v[1000005],l[1000005];
long long F[100005][105];
int main(){
int N,m,n=0;
scanf("%d%d",&N,&m);
for (int i=1; i<=m; i++) scanf("%d",&d[i]);
for (int i=1; i<=N; i++){
int W,V,L;
scanf("%d%d%d",&W,&V,&L);
if (1ll*W*L<=m){
n++;
w[n]=W;
v[n]=V;
l[n]=L;
}
}
for (int i=0; i<=m; i++)
for (int j=0; j<=n; j++)
F[i][j]=-1ll<<60;
F[0][0]=0;
for (int i=0; i<=m; i++)
for (int j=n; j>=0; j--)
if (F[i][j]!=-1ll<<60){
if (!j){
for (int k=1; k<=n; k++)
if (i+w[k]*l[k]<=m) F[i+w[k]*l[k]][k]=max(F[i+w[k]*l[k]][k],F[i][j]+1ll*v[k]*l[k]-d[i]);
}
else{
if (i+w[j]<=m) F[i+w[j]][j]=max(F[i+w[j]][j],F[i][j]+v[j]);
F[i][0]=max(F[i][0],F[i][j]);
}
}
long long ans=0;
for (int i=1; i<=m; i++){
for (int j=0; j<=n; j++) ans=max(ans,F[i][j]);
printf("%lld ",ans);
}
return 0;
}

  

最新文章

  1. kali Linux添加add-apt-repository
  2. git 忽略提交某个指定的文件(不从版本库中删除)
  3. jsonP跨域调用
  4. java集合-HashMap
  5. python range() 和xrange()的区别
  6. props
  7. 【ASP.NET Web API教程】6.4 模型验证
  8. 宠物AI(个人觉得有问题)
  9. 给Sublime Text2安装轻量级代码提示插件:SublimeCodeIntel
  10. java1200例-文字的探照灯效果
  11. Eclipse + PyDev 无法导入模块
  12. LeetCode 48 Anagrams
  13. 个人作业2 英语学习APP分析
  14. C语言缓冲区(缓存)详解
  15. [基础常识]申请免费SSL证书 - 阿里云云盾证书 - Digicert+Symantec 免费型DV SSL
  16. Mysql千万级大表优化
  17. MySQL数据库安装配置
  18. NODE_ENV不是内部或外部命令,也不是可运行的程序
  19. 报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1
  20. 递归&amp;栈帧空间

热门文章

  1. .NET资源站点汇总~
  2. 电脑Bois中usb模式启动热键
  3. 【转】monkey实战--测试步骤、常用参数、常规monkey命令
  4. If you can&#39;t take it, don&#39;t dish it out.
  5. MapReduce的编程思想(1)
  6. 如何在Android Studio中导入JNI生成的.so库
  7. zfs和ufs文件系统
  8. CentOS7.2上安装Python3.6
  9. 2018.2.28 PHP中使用jQuery+Ajax实现分页查询多功能如何操作
  10. opencv中mat矩阵如何debug