题目描述
有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入
第一行,一个整数,表示箱子容量; 第二行,一个整数,表示有n个物品; 接下来n行,分别表示这n个物品的各自体积。
输出
一个整数,表示箱子剩余空间。
样例输入 Copy
24 6 8 3 12 7 9 7
样例输出 Copy
0
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int v; // 箱子容量
int n; // 物品数量
cin >> v >> n;
vector<int> weights(n); // 物品体积数组
for (int i = 0; i < n; ++i) {
cin >> weights[i];
}
// dp[i] 表示容量为i的箱子能够装下的物品的最大体积
vector<int> dp(v + 1, 0);
// 动态规划求解
for (int i = 0; i < n; ++i) {
for (int j = v; j >= weights[i]; --j) {
// 如果当前物品可以放入箱子中,则尝试放入
dp[j] = max(dp[j], dp[j - weights[i]] + weights[i]);
}
}
// 箱子剩余空间即为箱子容量减去能够装下的物品的最大体积
int remainingSpace = v - dp[v];
cout << remainingSpace << endl;
return 0;
}
题目描述
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如果你是辰辰,你能完成这个任务吗?
输入
输入的第一行有两个整数T(1 < = T < = 1000)和M(1 < = M < = 100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。
输出
输出包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。
样例输入 Copy
70 3 71 100 69 1 1 2
样例输出 Copy
3
提示
对于30%的数据,M < = 10;对于全部的数据,M < = 100。(同1385)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int T, M;
cin >> T >> M;
vector<pair<int, int>> herbs(M); // 草药对(时间,价值)
for (int i = 0; i < M; ++i) {
cin >> herbs[i].first >> herbs[i].second;
}
vector<int> dp(T + 1, 0); // dp[i]表示在i时间内可以获得的最大价值
// 动态规划求解
for (const auto& herb : herbs) {
for (int j = T; j >= herb.first; --j) {
dp[j] = max(dp[j], dp[j - herb.first] + herb.second);
}
}
cout << dp[T] << endl; // 输出在T时间内可以获得的最大价值
return 0;
}