上机笔试编程训练 背包问题
2016-09-06 11:07
232 查看
参考::01背包问题和完全背包问题
http://blog.csdn.net/kangroger/article/details/38864689
题目描述
王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件 | 附件 |
电脑 | 打印机,扫描仪 |
书柜 | 图书 |
书桌 | 台灯,文具 |
工作椅 | 无 |
输入描述:输入的第 1 行,为两个正整数,用一个空格隔开:N m(其中 N ( <32000 )表示总钱数, m ( <60 )为希望购买物品的个数。)从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 ~ 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号) 输出描述: 输出文件只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值( <200000 )。
输入例子:
1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0
输出例子:2200#include <bits/stdc++.h>
using namespace std;
const int N = 100, M = 33000;
int v
[3], c
[3], f[M];
int n, m, cnt;
int main(){
while(scanf("%d%d", &m, &n) == 2){
memset(v, 0, sizeof(v[0]) * (n + 5));
memset(c, 0, sizeof(c[0]) * (n + 5));
memset(f, 0, sizeof(f[0]) * (m + 5));
for(int i = 1; i <= n; ++i){
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
if(z == 0) v[i][2] = x * y, c[i][2] = x;
else for(int j = 0; j <= 1; ++j) if(v[z][j] == 0) {
v[z][j] = x * y;
c[z][j] = x;
break;
}
}
for(int i = 1; i <= n; ++i){
for(int k = m; k >= 0; --k){
for(int s = 0; s < 4; ++s){
int val = v[i][2], cst = c[i][2];
for(int j = 0; j <= 1; ++j){
if(s & (1 << j)) val += v[i][j], cst += c[i][j];
}
if(cst <= k) f[k] = max(f[k], f[k - cst] + val);
}
}
}
printf("%d\n", f[m]);
}
return 0;
}
相关文章推荐
- 使用动态编程方法,在降低时间复杂度的情况下获得背包问题的最优解
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- SDAU 编程练习三 动态规划和动态规划与背包问题相结合的问题
- 算法训练 入学考试(背包问题)
- 算法训练 装箱问题(0-1背包)
- 【编程】背包问题
- 笔试中背包问题的应用
- 蛮力法:设计算法求解背包问题,并编程实现。
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解) .
- HDU上的专题训练(背包问题-线段树+树状数组+DP优化+网络流+字符匹配+最短路+矩阵
- 华为上机笔试原题+代码---------股票投资问题
- 挑战编程 程序设计竞赛训练手册-1.6.1 3n+1问题(3n+1 Problem)
- 编程训练矩阵问题
- 背包问题--(一本通)课后训练
- 背包问题---01背包(原理,伪代码,编程实现)
- 腾讯2008年笔试题-背包问题 递归和非递归解法
- HDU上的专题训练(背包问题-线段树+树状数组+DP优化+网络流+字符匹配+最短路+矩阵乘法+搜索专题++)
- 谷歌笔试题-背包问题
- 一道编程之美上的问题-腾讯的笔试题目:求数组的部分乘积
- 补充,上次链家笔试的0-1背包问题