8 条题解
-
2
已AC
#include <bits/stdc++.h> using namespace std; int maxw, n, w[100005], v[100005], f[100005]; int main() { cin >> maxw >> n; for (int i = 1; i <= n; i++) cin >> v[i] >> w[i]; for (int i = 1; i <= n; i++) for (int j = maxw; j >= 1; j--) if (j >= v[i]) f[j] = max(f[j], f[j - v[i]] + w[i]); cout << f[maxw]; return 0; }
-
2
本蒟蒻第五次发题解,请大佬们多多关照 01背包
#include <bits/stdc++.h> using namespace std; struct node { int w;//重量 int v;//价值 }a[110]; int f[110][20010]; int main() { int w, n; cin >> w >> n; int i, j, h; for (i = 1; i <= n; i++) { cin >> a[i].w >> a[i].v;//输入 } for (i = 1; i <= n; i++) { for (j = 1; j <= w; j++) { if (a[i].w > j)f[i][j] = f[i - 1][j]; else { f[i][j] = max(f[i - 1][j], f[i - 1][j - a[i].w] + a[i].v); } } }//把表打出来 cout << f[n][w];//输出,完工 }
麻烦高抬贵手点个赞,谢谢^_^
-
1
#include<bits/stdc++.h> using namespace std; int maxw,n,w[105],p[105],f[20005]; int main(){ ios::sync_with_stdio(false); // 浅浅地加速一下输入吧 cin.tie(0); cin>>maxw>>n; for(int i=1;i<=n;i++)cin>>w[i]>>p[i]; for(int i=1;i<=n;i++) for(int j=maxw;j>=w[i];j--) f[j]=max(f[j],f[j-w[i]]+p[i]); cout<<f[maxw]; return 0; }
-
1
</span>#include <bits/stdc++.h> using namespace std; const int N=20005; int n,m; int w[N],p[N]; int f[N]; int main() { cin >> m >> n; for(int i = 1;i<=n;i++)cin>>w[i]>>p[i]; for(int i = 1;i<=n;i++) for(int j = m;j>=1;j--) if(j>=w[i]) f[j]=max(f[j],f[j-w[i]]+p[i]); cout<<f[m]; } //最简单的01背包问题,模板直接套
-
0
#include<bits/stdc++.h> using namespace std; int knapsack(int maxw, int n, int* w, int* p) { int f[22222]; memset(f, 0, sizeof(f)); // 初始化f数组为0 for (int i = 1; i <= n; i++) { for (int j = maxw; j >= w[i]; j--) { f[j] = max(f[j], f[j - w[i]] + p[i]); } } return f[maxw]; } int main() { int maxw, n; cin >> maxw >> n; int w[111], p[111]; for (int i = 1; i <= n; i++) cin >> w[i] >> p[i]; cout << knapsack(maxw, n, w, p); return 0; }
背包问题是一个经典的组合优化问题,它的目标是在给定背包容量的情况下,选择一些物品放入背包中,使得物品的总价值最大化。
代码的主要思路是使用动态规划来求解背包问题。首先,读入背包的最大容量
maxw
和物品的数量n
。然后,通过循环读取每个物品的重量w[i]
和价值p[i]
。接下来,我们定义一个一维数组
f
,用于存储每个背包容量对应的最大总价值。数组f[j]
表示在背包容量为j
时,可以获取的最大总价值。初始状态下,所有的背包容量对应的最大总价值都为0。接着,使用两层循环遍历每个物品和每个背包容量。外层循环是物品的循环,内层循环是背包容量的循环。在每一次循环中,我们尝试将当前的物品放入背包中,更新对应背包容量的最大总价值。具体的更新方式是,比较不放入当前物品时的最大总价值
f[j]
和放入当前物品时的最大总价值f[j - w[i]] + p[i]
,取较大的值作为当前背包容量的最大总价值。最后,输出
f[maxw]
即为在给定背包容量情况下可以获取的最大总价值,即背包问题的解。整个算法的时间复杂度为O(n * maxw),其中n为物品的数量,maxw为背包的最大容量。该算法的核心思想是将问题划分为子问题并利用子问题的最优解来构建整体问题的最优解,从而得到高效的解决方案。
-
0
升级版
#include <bits/stdc++.h> using namespace std; struct node { int w, v; }a[110]; int w, n; int f[20010]; int main() { cin >> w >> n; int i, j; for (i = 1; i <= n; i++) { cin >> a[i].w >> a[i].v; } for (i = 1; i <= n; i++) { for (j = w; j >= a[i].w; j--) {//记得从右往左,否则会WA f[j] = max(f[j], f[j - a[i].w] + a[i].v); } } cout << f[w]; }
-
-4
写题解请注意 鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 280
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 4
- 标签
- 递交数
- 143
- 已通过
- 63
- 上传者