题目:

点击跳转


输入:

1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0

输出:

2200

解题:

初看这道题,数据就 m<60, 感觉dfs就能直接搜索过,结果TLE,仔细再想一想会发现时间复杂度达到了O(m^m) 。

TLE代码:

#include <bits/stdc++.h>
using namespace std;const int N = 100;
struct node {int v, p, q;
}a[N];
int n, m;
int vis[N];
int ans;void dfs ( int price_sum, int sum , int pre ) { //pre 存储选的前一个的乘积值if ( price_sum > n ) {ans = max( ans, sum-pre);return ;}for ( int i = 1; i <= m; i ++ ) {if ( !vis[i] && vis[a[i].q] ) { //如果它是附件,判断主件是否被选vis[i] = 1;int t = a[i].v*a[i].p;dfs ( price_sum + a[i].v, sum + t, t );vis[i] = 0;}}
}int main() {scanf("%d%d", &n, &m);for ( int i = 1; i <= m; i ++ ) {scanf("%d%d%d", &a[i].v, &a[i].p, &a[i].q);}memset( vis, 0, sizeof( vis));vis[0] = 1; // 先将0置为被选,便于后续判断中主件直接被选dfs (0, 0, 0 );printf("%d\n", ans);return 0;
}

所以在这里我们换种思路:

  • 题意:每个主件最多只有两个附件,且附件没有附件
  • 因此我们可以通过转化,把原问题转化为 01背包问题来解决。在用 01背包之前我们需要进行预处理,把 每一种物品归类(把每一个主件和它的附件看作一类物品)。
  • 当取某件物品时,我们只需要从以下五种方案中取最大的那种方案:
    • 不取
    • 只取主件
    • 取主件+附件1
    • 取主件+附件2
    • 既主件+附件1+附件2
  • 时间复杂度 O(m*n)

所以得到 状态转移方程

dp[i][j] = max (
dp[i-1,j],
dp[i-1][j-a[i][0]] + a[i][0]*b[i][0],
dp[i-1][j-a[i][0]-a[i][1]] + a[i,0]*b[i][0] + a[i][1]*b[i][1],
dp[i-1][j-a[i][0]-a[i][2]] + a[i][0]*b[i][0] + a[i][2]*b[i][2],
dp[i-1][j-a[i][0]-a[i][1]-a[i][2]] + a[i][0]*b[i][0] + a[i][1]*b[i][1] + a[i][2]*b[i][2]
);

AC代码

#include <bits/stdc++.h>
using namespace std;const int N = 65;
int w[N][3], v[N][3], dp[N][3205];
int n, m, c, p, q;int main() {cin >> n >> m;n /= 10; // n/10 便于节省时间与空间for ( int i = 1; i <= m; i ++) {cin >> c >> p >> q;c /= 10; // 与上述同理if ( q == 0 ) {  //预处理存储 (i,0) 存储主件,w[i][q] = c; v[i][q] = c*p;}else if ( w[q][1] == 0 ) { //(i,1)存储第一个附件w[q][1] = c; v[q][1] = c*p;}else { // (i,2) 存储第二个附件w[q][2] = c; v[q][2] = c*p;}}memset( dp, 0, sizeof(dp) );for( int i = 1; i <= m; i ++ ) {for ( int j = 1; j <= n; j ++ ) {dp[i][j] = dp[i-1][j]; // 不取if ( j >= w[i][0] ) {  // 只取主件dp[i][j] = max( dp[i][j], dp[i-1][j-w[i][0]] + v[i][0]);}if ( j >= w[i][0] + w[i][1] ) { // 取主件+附件1dp[i][j] = max( dp[i][j], dp[i-1][j-w[i][0]-w[i][1]] + v[i][0] + v[i][1]);}if ( j >= w[i][0] + w[i][2] ) { // 取主件+附件2dp[i][j] = max( dp[i][j], dp[i-1][j-w[i][0]-w[i][2]] + v[i][0] + v[i][2]);}if ( j >= w[i][0] + w[i][1] + w[i][2] ) { //取主件+附件1+附件2dp[i][j] = max( dp[i][j], dp[i-1][j-w[i][0]-w[i][1]-w[i][2]] + v[i][0] + v[i][1]+ v[i][2]);}}}cout << dp[m][n]*10 << endl;return 0;
}

金明的预算方案(01背包)相关推荐

  1. (01背包扩展) 算法提高 金明的预算方案

      算法提高 金明的预算方案   时间限制:1.0s   内存限制:256.0MB     

  2. 【每日DP】day7P1064 金明的预算方案 (分组背包,我又悟了)难度⭐⭐★

    P1064 金明的预算方案 背包其实就是把一个大问题拆分成若干个子问题,把一个要拿东西的动作按照题目要求分成若干个动作,分别枚举(DP其实就是非常的暴力),比较取最大值. 比如这道题,背包的物品之间是 ...

  3. 不止代码:洛谷P1064 金明的预算方案+P2014选课(依赖背包)

    文章目录 题目描述 总结 解析 解法1 解法2 代码 解法3 代码 题目描述 金明的预算方案 选课 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是, ...

  4. 金明的预算方案(分组背包)

    T2 金明的预算方案 http://www.tyvj.cn/p/1057 背景 NOIP2006 提高组 第二道 描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房 ...

  5. 依赖背包dp NOIP2006 vijos 1313 金明的预算方案

    依赖背包: 简化的问题 这种背包问题的物品间存在某种"依赖"的关系.也就是说,物品i依赖于物品j,表示若选物品i,则必须选物品j.为了简化起见,我们先设没有某个物品既依赖于别的物品 ...

  6. 背包形动态规划 fjutoj2375 金明的预算方案

    金明的预算方案 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 金明今天很开 ...

  7. 【背包DP练习】洛谷 P5020货币系统 P1757通天之分组背包 P1064[NOIP2006 提高组]金明的预算方案 P5322 [BJOI2019]排兵布阵

    洛谷 P5020货币系统 https://www.luogu.com.cn/problem/P5020 思路是把货币从小到大排序,然后按顺序依次完全背包dp,每次dp检查i-1种面值的货币能不能凑出第 ...

  8. P1064 金明的预算方案

    P1064 金明的预算方案 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置 ...

  9. [LuoguP1064][Noip2006]金明的预算方案

    金明的预算方案(Link) 题目描述 现在有\(M\)个物品,每一个物品有一个钱数和重要度,并且有一个\(Q\),如果\(Q = 0\),那么该物件可以单独购买,当\(Q != 0\)时,表示若要购买 ...

  10. P1064 [NOIP2006 提高组] 金明的预算方案

    P1064 [NOIP2006 提高组] 金明的预算方案 题意: 每个物品有价格和价值,物品之间存在依赖关系(单向的),现在又n元钱,买哪些物品,即满足依赖关系又使得每件物品的价格与价值的乘积的总和最 ...

最新文章

  1. 一行代码不用写,就可以训练、测试、使用模型,这个star量1.5k的项目帮你做到...
  2. numpy 数组和矩阵的乘法
  3. Retrofit get post query filed FiledMap
  4. Mybatis中 $ 和 # 千万不要乱用!
  5. requests(一): 发送一个json格式的post请求
  6. pythonunicode转为字符串_python中将 \\uxxxx转换为 Unicode字符串
  7. 局域网计算机中arp,在局域网中的一台计算机上使用了arp-a命令,有如下输出: C:\arp.a Interface: 192.168.0.1 0n - 赏学吧...
  8. Linux环境下Android开发环境的搭建
  9. 沃罗诺伊图是怎样的?
  10. 【报告分享】2021年中国人工智能产业研究报告:数字经济时代的产业升级探索.pdf(附下载链接)...
  11. pycharm git OpenSSL SSL_read: Connection was reset, errno 10054
  12. spring源码:实例化bean的准备工作
  13. 坐标转换 | 高斯坐标转经纬度坐标
  14. 计算机组装有哪些,详解电脑组装配置有哪些
  15. 明明在内网,做种的人很多,为什么在transmission里bt下载速度仅10kb/s
  16. mendeley引用参考文献不显示_ubuntu下使用mendeley插入参考文献
  17. blender 绘制离散顶点, SMPL骨架绘制
  18. 什么是noshow和goshow
  19. 服务器全息显示修改,柔性全息显示器:通过拉伸就能切换显示信息
  20. mysql嵌套查询详解_MySQL嵌套查询实例详解_MySQL

热门文章

  1. pb中数据窗口函数小结
  2. java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.c
  3. DNS:快速搭建公司内网DNS解析服务器
  4. 一文理解二元logistic回归
  5. 【跨语言剽窃检测】文本相似度分析之一
  6. 数据增强方式mosaic(基于yolo4)代码实现python
  7. IT行业现在的就业前景怎么样?
  8. 个人博客网站建设详细版
  9. oracle表空间不足影响,oracle表空间不足
  10. 【研报】供应链流通视角,透视中国商流之变革