3 条题解
-
7
思路
对于每种学科相当于一组物品,每种物品只能选一个,题目就转化为相对比较简单的分组背包问题。只需要注意2点:(1)对于总体积j的枚举顺序是和01背包一样,是从大到小(2)和01背包相比,会多一层内部循环遍历每组的物品。代码
#include<iostream> using namespace std; const int maxn = 105; int f[maxn], w[maxn][maxn]; int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cin >> w[i][j]; } } for (int i = 1; i <= n; ++i) { for (int j = m; j >= 1; --j) { for (int k = 1; k <= j; ++k) { f[j] = max(f[j], f[j - k] + w[i][k]); } } } cout << f[m]; return 0; }
-
5
听好了乡巴佬们!这题不会做的要扣税!!!
一级难度,我用
脚指头都可以编写代码!!!题目就是简单的分组背包问题呀!!!不会的回到课里重听!!!注意一下:对于总体积j的枚举顺序是是01背包一毛一样,就是从大到小排。这道题会多一层内部循环遍历每组的物品。就成了三重循环。
#include<iostream> using namespace std; const int MAXN = 105; int a[MAXN], b[MAXN][MAXN]; int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cin >> b[i][j]; } } for (int i = 1; i <= n; ++i) { for (int j = m; j >= 1; --j) { for (int k = 1; k <= j; ++k) { a[j] = max(a[j], a[j - k] + b[i][k]); } } } cout << a[m]; return 0; } //课上都讲过有啥难的?固定的代码,so easy!!!
-
2
#include <bits/stdc++.h> using namespace std; int f[105], w[105][105]; int main() { int n , m; cin >> n >> m; for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= m ; j++) { cin >> w[i][j]; } } for(int i = 1 ; i <= n ; i++) { for(int j = m ; j >= 1 ; j--) { for(int k = 1 ; k <= j ; k++) { f[j] = max(f[j] , f[j - k] + w[i][k]); } } } cout << f[m]; return 0; }
- 1
信息
- ID
- 386
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- (无)
- 递交数
- 309
- 已通过
- 210
- 上传者