AcWing 3. 完全背包问题
2024-10-08 09:18:10
朴素
#include<iostream>
#include<algorithm>
using namespace std ;
const int N=;
int n,m;
int v[N],w[N];
int f[N][N];
int main() {
cin>>n>>m;//n个物品 最大体积位m
for(int i=; i<=n; i++) cin>>v[i]>>w[i];
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
for(int k=; k*v[i]<=j; k++)//选k个第i个物品
f[i][j]=max(f[i][j],f[i-][j-v[i]*k]+k*w[i]);
cout<<f[n][m]<<endl;
return ;
}
优化二维
//01背包从i-1转移过来 而完全背包是从第
i层转移过来
#include <iostream>
#include <algorithm>
using namespace std;
const int N = ;
int n, m;
int v[N], w[N];
int f[N][N];
int main() {
cin >> n >> m;
for (int i = ; i <= n; i ++ ) cin >> v[i] >> w[i];
for (int i = ; i <= n; i ++ )
for (int j = ; j <= m; j ++ )
for(int k=; k*v[i]<=j; k++)
f[i][j] = max(f[i][j], f[i-][j - v[i]*k] + w[i]*k);
cout << f[n][m] << endl;
return ;
}
终极一维
//一维
#include <iostream>
#include <algorithm>
using namespace std;
const int N = ;
int n, m;
int v[N], w[N];
int f[N];
int main() {
cin >> n >> m;//n是数量,m是体积
for (int i = ; i <= n; i ++ )
cin >> v[i] >> w[i];
for (int i = ; i <= n; i ++ )
for (int j = v[i]; j <= m; j ++ )
f[j] = max(f[j], f[j - v[i]] + w[i]);
cout << f[m] << endl;
return ;
}
最新文章
- ios h5 app avalon tap点击事件失效及点击延迟300ms问题解决方法
- 《javascript高级程序设计》第三章学习笔记
- C++中的链接错误
- MSSERVER创建链接服务器
- CSS3.0盒模型display:-webkit-box;的使用
- Android 中SimpleDateFormat的使用注意
- 真正意义上下一代 Windows Embedded:有关 Windows 10 ";Athens"; 的事
- webapp框架集合
- JavaScript的DOM操作(一)
- 瞎j8封装第二版之数据库连接池
- 新概念英语(1-101)A Card From Jimmy
- Scrum Meeting 合集
- Python开发【第九篇】:协程、异步IO
- 翻转一个数组(c++实现)
- python学习日记(数据结构习题)
- time 模块 与 datetime 模块
- 洛谷P3225 HNOI2012 矿场搭建
- LoadRunner接口测试标准模板
- 关于购物车程序的Python实现
- 1.3.2、CDH 搭建Hadoop在安装之前(端口---Cloudera Navigator加密使用的端口)