背包模型题目
[NOIP2005 普及组] 采药
题目描述
https://www.luogu.com.cn/problem/P1048
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
如果你是辰辰,你能完成这个任务吗?
输入格式
第一行有 个整数 ()和 (),用一个空格隔开, 代表总共能够用来采药的时间, 代表山洞里的草药的数目。
接下来的 行每行包括两个在 到 之间(包括 和 )的整数,分别表示采摘某株草药的时间和这株草药的价值。
输出格式
输出在规定的时间内可以采到的草药的最大总价值。
样例输入 #1
70 3
71 100
69 1
1 2
样例输出 #1
3
【数据范围】
- 对于 的数据,;
- 对于全部的数据,。
题目
显然是01背包模版题目
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
int n, m;
cin >> m >> n;
vector<int> f(m + 1);
for (int i = 1; i <= n; i++) {
int v, w;
cin >> v >> w;
for(int j=m;j>=v;j--)
f[j]= max(f[j],f[j-v]+w);
}
cout<<f[m]<<endl;
return 0;
}
[NOIP2001 普及组] 装箱问题
题目描述
有一个箱子容量为 ,同时有 个物品,每个物品有一个体积。
现在从 个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最小值。
输入格式
第一行共一个整数 ,表示箱子容量。
第二行共一个整数 ,表示物品总数。
接下来 行,每行有一个正整数,表示第 个物品的体积。
输出格式
- 共一行一个整数,表示箱子最小剩余空间。
样例输入 #1
24
6
8
3
12
7
9
7
样例输出 #1
0
对于 数据,满足 ,。
题目
题目说要求剩余体积最小,意思就是要让我们求装进去的体积最大,但是这里和01背包问题相比少了一个变量(01背包问题是体积和价值)
在这里,可以将价值看成体积,体积看成体积即可。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
int n,m;
cin>>m>>n;
vector<int> f(m+1);
for(int i=1;i<=n;i++){
int v;
cin>>v;
for(int j=m;j>=v;j--)
f[j]= max(f[j],f[j-v]+v);
}
cout<<m-f[m]<<endl;
return 0;
}