[zoj3623]背包模型

给定n种物品,每种物品需要ti时间生产出来,生产出来以后,每单位时间可以创造wi个价值。如果需要创造至少W个价值,求最少时间。

思路:dp[j]表示用时间j所能创造的最大价值,则有转移方程:dp[j + t[i]] = max(dp[j + t[i], dp[j] + t * w[i]])。另外是否需要按一定顺序排序呢??以下是ac代码。

 1 #pragma comment(linker, "/STACK:10240000,10240000")
 2
 3 #include <iostream>
 4 #include <cstdio>
 5 #include <algorithm>
 6 #include <cstdlib>
 7 #include <cstring>
 8 #include <map>
 9 #include <queue>
10 #include <deque>
11 #include <cmath>
12 #include <vector>
13 #include <ctime>
14 #include <cctype>
15 #include <set>
16
17 using namespace std;
18
19 #define mem0(a) memset(a, 0, sizeof(a))
20 #define lson l, m, rt << 1
21 #define rson m + 1, r, rt << 1 | 1
22 #define define_m int m = (l + r) >> 1
23 #define rep(a, b) for (int a = 0; a < (b); a++)
24 #define rep1(a, b) for (int a = 1; a <= (b); a++)
25 #define all(a) (a).begin(), (a).end()
26 #define lowbit(x) ((x) & (-(x)))
27 #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}
28 #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}
29 #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {}
30 #define pc(a) putchar(a)
31 #define ps(a) printf("%s", a)
32 #define pd(a) printf("%d", a)
33 #define sd(a) scanf("%d", &a)
34
35 typedef double db;
36 typedef long long LL;
37 typedef pair<int, int> pii;
38 typedef multiset<int> msi;
39 typedef set<int> si;
40 typedef vector<int> vi;
41 typedef map<int, int> mii;
42
43 const int dx[8] = {0, 1, 0, -1, 1, 1, -1, -1};
44 const int dy[8] = {1, 0, -1, 0, -1, 1, 1, -1};
45 const int maxn = 1e5 + 7;
46 const int maxm = 1e5 + 7;
47 const int maxv = 1e7 + 7;
48 const int max_val = 1e6 + 7;
49 const int MD = 1e9 +7;
50 const int INF = 1e9 + 7;
51 const double PI = acos(-1.0);
52 const double eps = 1e-10;
53
54 template<class T> T gcd(T a, T b) { return b == 0? a : gcd(b, a % b); }
55
56 int f[700], a[40], b[40];
57
58 int main() {
59     //freopen("in.txt", "r", stdin);
60     int n, l;
61     while (cin >> n >> l) {
62         rep(i, n) {
63             sd(a[i]);
64             sd(b[i]);
65         }
66         int maxt = 330;
67         mem0(f);
68         rep(i, n) {
69             rep(j, maxt) {
70                 f[j + a[i]] = max(f[j + a[i]], f[j] + j * b[i]);
71             }
72         }
73         int ans;
74         rep(i, maxt * 2) {
75             if (f[i] >= l) {
76                 ans = i;
77                 break;
78             }
79         }
80         cout << ans << endl;
81     }
82     return 0;
83 }

时间: 2024-10-06 00:16:02

[zoj3623]背包模型的相关文章

HDU 1712 ACboy needs your help-dp-(分组背包模型)

题意:n门课程用m天来学习,每门课用不同的天数来学习会有不同的学分,求能得到的最大的学分 分析:第一次接触分组背包.分组背包的模型就是不同的物品有不同的花费和价值,求在规定花费内能得到的最大的价值,这前面跟以前的背包最大的不同是物品分为几组,每组内的物品最多只能选一种:dp[i][j]表示前i组花费j能得到的最大的价值,不过实际在做的时候用一维数组就可以了 公式: for 组i for 花费j (从大到小) for 组内物品k if(j>=c[k]) dp[j]=max(dp[j],dp[j-c

背包模型

01背包:从右往左(因为只能由上一个物品的状态退出,如果从左往右则前边的保存的已是装了这件物品的值)递推,放不放此物品 完全背包:从左往右递推 多重背包:二进制拆包,或用单调队列优化(应该不考吧看的不明白QAQ) 装满背包:只把f[0]设为0 分组背包:把有依赖关系的方程一组,然后在一个阶段了分别dp不取附件,取一个,取两个(只有主次依赖) 二维费用:再加一维费用的循环 混合背包模板 #include<iostream> #include<cstdio> #include<a

动态规划--01背包模型

01背包剖析 问题引入 题目来源:ACwing:01背包问题 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次.第 i 件物品的体积是 vi,价值是 wi.求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出最大价值. 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积. 接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值. 输出格式 输出一个整数,表示最大价值. 数据范围 0<N,V≤1000

金矿模型看动归(PASCAL版)

原文地址:http://www.cnblogs.com/SDJL/archive/2008/08/22/1274312.html{PASCAL语言} 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出

通过金矿模型介绍动态规划

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节----初识动态规划-------- 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和

codevs1959拔河比赛(二维费用背包)

1959 拔河比赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入描述 Input Description 数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight<=450).

Codeforces Round #214 (Div. 2) C. Dima and Salad 背包

C. Dima and Salad Dima, Inna and Seryozha have gathered in a room. That's right, someone's got to go. To cheer Seryozha up and inspire him to have a walk, Inna decided to cook something. Dima and Seryozha have n fruits in the fridge. Each fruit has t

通过金矿模型介绍动态规划(转)

原文地址 点击下载01背包测试数据.rar 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节----初识动态规划-------- 经典的01背包问题是这样的: 有一个包和n个

通过金矿模型介绍动态规划(经典入门)

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节----初识动态规划-------- 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和