博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NOIP提高组]金明的预算方案
阅读量:5051 次
发布时间:2019-06-12

本文共 1222 字,大约阅读时间需要 4 分钟。

题目分析

首先这道题目是背包九讲里面第7讲中的有依赖的背包(不过那篇我没怎么看懂),本题中我们可以把附件和主件看成一组,总共有4种情况。

1.选主件 不选附件

2.选主件 选附件1

3.选主件 选附件2

4.选主件 选附件1 和 选附件2

这四种情况,我们可以可以做一次01背包,选出主件这一组中这四种情况中的最大价值即可。

还有一个优化是 因为钱是10的倍数 可以除以10  减少空间占用

#include 
#include
using namespace std;int n,m,V;int v[62],w[62],v1[62],w1[62],v2[62],w2[62];int dp[5005];int ans;int main(){ scanf("%d%d",&V,&m); V/=10; for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); x/=10; if(z){ if(!v1[z]){ v1[z]=x; w1[z]=x*y; } else{ v2[z]=x; w2[z]=x*y; } } else{ v[i]=x; w[i]=y*x; n=i; } } for(int i=1;i<=n;i++) for(int j=V;j>=v[i];j--){ dp[j] = max(dp[j],dp[j-v[i]]+w[i]); if(j-v[i]-v1[i]>=0) dp[j] = max(dp[j],dp[j-v[i]-v1[i]]+w[i]+w1[i]); if(j-v[i]-v1[i]-v2[i]>=0) dp[j] = max(dp[j],dp[j-v[i]-v1[i]-v2[i]]+w[i]+w1[i]+w2[i]); if(j-v[i]-v2[i]>=0) dp[j] = max(dp[j],dp[j-v[i]-v2[i]]+w[i]+w2[i]); } printf("%d",dp[V]*10); return 0;}
代码实现

 

转载于:https://www.cnblogs.com/OIerLYF/p/6928124.html

你可能感兴趣的文章
请尽可能详尽的解释ajax的工作原理
查看>>
[原创]k8exe2bat任意文件转Bat工具(WebShell无法上传EXE解决方案)
查看>>
yii2框架dropDownList的下拉菜单用法介绍
查看>>
c#截取两个指定字符串中间的字符串
查看>>
UDP基础-1
查看>>
康托展开了解一下
查看>>
通讯聊天工具(pingin)
查看>>
odoo10 高级视图
查看>>
IE 专有的事件驱动方法 Named Script
查看>>
hibernateTemplate.find或hibernateTemplate.save()执行操作没有反应,但是有sql语句
查看>>
SQL Server 查询性能优化——索引与SARG(一)
查看>>
到底还是中国人,这官话都一套一套的
查看>>
团队冲刺07
查看>>
自学知识(四)
查看>>
字典操作
查看>>
Java 排序(快排,归并)
查看>>
解析html
查看>>
linux日常管理-系统进程查看工具-ps
查看>>
HandlerThread&Looper&MessageQueue
查看>>
ROM的一种写法
查看>>