洛谷P1049 [NOIP2001 普及组] 装箱问题
2024-09-05 12:42:48
本题就是一个简单的01背包问题
1.因为每个物品只能选一次,而且要使箱子的剩余空间为最小。所以可以确定属性为 MAX
2.由于是从n个物品里面选i个物品 那么就是选出的i个物品的空间总和要尽可能的大
就可以得到动态规划的表达式
f[i][j] = max(f[i-1][j],f[i-1][j-w[i]] + w[i]);
就可以得到完整的代码
#include <iostream> using namespace std;
const int N = 55 , M = 20010;
int f[M][M];
int w[N];
int n;
int v;
int main()
{
cin >> v >> n;
for ( int i = 1; i <= n; i++ ) cin >> w[i]; for( int i = 1 ; i <= n ; i++ )
for( int j = 0 ; j <= v ; j++ )
{
f[i][j] = f[i -1][j];
if( j >= w[i] ) f[i][j] = max(f[i-1][j],f[i-1][j-w[i]] + w[i]);
}
cout << v - f[n][v];
return 0;
}
我觉得这个还是不够好,由于此题是线性Dp所以我们用滚动数组进行优化
得到以下代码,一下就变快了不少呢
#include <iostream> using namespace std;
const int N = 55 , M = 20010;
int f[M];
int w[N];
int n;
int v;
int main()
{
cin >> v >> n;
for ( int i = 1; i <= n; i++ ) cin >> w[i]; for ( int i = 1 ; i <= n; i++ )
for ( int j = v; j >= w[i]; j-- )
{
f[j] = max(f[j],f[j - w[i]] + w[i]);
}
cout << v - f[v];
return 0;
}
最新文章
- 敏捷转型历程 - Sprint4 回顾会
- Windows下安装node
- CSU 1809 Parenthesis(线段树+前缀和)
- 强大的网络通信框架(不实现缓存)--第三方开源--AsyncHttpClient
- CentOS 配置Apache+Mysql+PHP (yum)与卸载
- BootStrap 智能表单系列 十 自动完成组件的支持
- Push segues can only be used when the.....
- java 一维数组
- 【BZOJ5316】[JSOI2018]绝地反击(网络流,计算几何,二分)
- Alpha冲刺随笔四:第四天
- Pytorch中的Batch Normalization操作
- 通过ssh实现远程登陆服务器!
- Spring事务管理要点总结
- numpy.argsort详解
- [leetcode]236. Lowest Common Ancestor of a Binary Tree 二叉树最低公共父节点
- Vue-cli 配置开发环境让测试服务器监听所有IP
- Day6 jQuery
- bzoj 4919 [Lydsy1706月赛]大根堆 set启发式合并+LIS
- 【数论】【扩展欧几里得】Codeforces Round #484 (Div. 2) E. Billiard
- Rafy中的EventBus