ACM模式
A + B问题
输入描述:输入的第一行为一个整数N,接下来N行每行先输入一个整数M,然后在同一行内输入M个整数。
输出描述:对于每组输入,输出M个数的和,每组输出之间输出一个空行。
#include<iostream>
using namespace std;
int main (){
int N;
while (cin >> N) {
while (N--) {
int M, num;
int sum = 0;
cin >> M;
while (M--){
cin >> num;
sum += num;
}
cout << sum << endl;
if (N > 0) cout << endl;
}
}
return 0;
}
字符串处理
从标准输入(stdin)读取一行文本(直到遇到换行符)并将其存储在字符串变量input中。std::getline()函数读取一行文本,而std::istringstream()将字符串转换为输入字符串流(istringstream),以便可以使用>>运算符从中读取整数。
一个简单的例子来说明:
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string input;
getline(cin, input); // 从标准输入读取一行文本并将其存储在input中
istringstream iss(input); // 将input转换为输入字符串流
int num;
iss >> num; // 从iss中读取一个整数并将其存储在num中
cout << "Read integer: " << num << endl;
return 0;
}
在这个例子中,程序首先从标准输入读取一行文本,然后将其转换为输入字符串流。接着,程序从输入字符串流中读取一个整数并将其存储在变量num中。最后,程序输出读取到的整数。
例题:输入物品件数M,背包容量为N,再输入物品价值,求可携带最大价值
#include <iostream>
#include <vector>
using namespace std;
int main() {
int M, N;
cin >> M >> N; // 01背包,动态规划
vector<int> weight(M);
vector<int> value(M);
for (int i = 0; i < M; i++) {
cin >> weight[i];
}
for (int i = 0; i < M; i++) {
cin >> value[i];
}
vector<vector<int>> dp(M, vector<int>(N + 1, 0));
for (int k = weight[0]; k <= N; k++) dp[0][k] = value[0]; // i从1开始
for (int i = 1; i < M; i++) {
for (int j = 0; j <= N; j++) {
if (j < weight[i]) dp[i][j] = dp[i - 1][j];
else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
}
}
cout << dp[M - 1][N] << endl;
return 0;
}
// 一维dp数组实现,滚动数组
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 读取 M 和 N
int M, N;
cin >> M >> N;
vector<int> costs(M);
vector<int> values(M);
for (int i = 0; i < M; i++) {
cin >> costs[i];
}
for (int j = 0; j < M; j++) {
cin >> values[j];
}
// 创建一个动态规划数组dp,初始值为0
vector<int> dp(N + 1, 0);
// 外层循环遍历每个类型的研究材料
for (int i = 0; i < M; ++i) {
// 内层循环从 N 空间逐渐减少到当前研究材料所占空间
for (int j = N; j >= costs[i]; --j) {
// 考虑当前研究材料选择和不选择的情况,选择最大值
dp[j] = max(dp[j], dp[j - costs[i]] + values[i]);
}
}
// 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值
cout << dp[N] << endl;
return 0;
}