博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gym 101081K Pope's work dp
阅读量:4625 次
发布时间:2019-06-09

本文共 1589 字,大约阅读时间需要 5 分钟。

Gym 101081K  

题意:n 个箱子,自重为wi,承重 ri(包括本身),问最多可以有多少个箱子堆在一起。

tags:

dp[i][j]表示前 i 个箱子取 j 个堆在一起的最小重量,但这里要先按 ri 从小到大排个序。

可以这样理解,设两个箱子p1,p2,参数为w1, r1, w2, r2,且 r1<r2。 如果 p2 能放在 p1 上面,则 p1 肯定也能放在 p2 上,而且后者是更优的,因为会有更多的剩余承重。

所以排了序后,对于第 i 个,只要考虑它前面的箱子即可。

然后 dp 转移:

1】如果不取第 i 个,则 dp[i][j] = min(dp[i][j], dp[i-1][j] );

2】如果能取第 i 个,则 dp[i][j] = min(dp[i][j], dp[i-1][j-1]+w[i] );

dp[i][0]初始化为 0,其它为 INF,即前 i 个取 j 个无法承重则为无穷大。

最后在 dp[n][i] 中取不为 INF 的最大的 i 即是答案。

#include
using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define rep(i,a,b) for (int i=a; i<=b; ++i)#define per(i,b,a) for (int i=b; i>=a; --i)#define mes(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define MP make_pair#define PB push_back#define fi first#define se secondtypedef long long ll;const int N = 1005;int T, n, dp[N][N];struct P { int wi, ri; bool friend operator < (P a, P b) { return a.ri < b.ri; }} p[N];int main(){ scanf("%d", &T); while(T--) { mes(dp, INF); scanf("%d", &n); rep(i,1,n) scanf("%d%d", &p[i].wi, &p[i].ri); sort(p+1, p+1+n); rep(i,0,n) dp[i][0] = 0; rep(i,1,n) { rep(j,1,i) { if(i-1 >= j) dp[i][j] = min(dp[i][j], dp[i-1][j]); if(dp[i-1][j-1]+p[i].wi<=p[i].ri && dp[i][j]>dp[i-1][j-1]+p[i].wi) dp[i][j] = dp[i-1][j-1]+p[i].wi; } } per(i,n,1) if(dp[n][i]!=INF) { printf("%d\n", i); break; } } return 0;}

转载于:https://www.cnblogs.com/sbfhy/p/7518176.html

你可能感兴趣的文章
pytorch简单测试
查看>>
POJ2155(二维树状数组)
查看>>
ssh整合
查看>>
大数组分时加载算法 timedChunk
查看>>
windows下简单使用pip
查看>>
Celery的基本使用
查看>>
最小生成树 克鲁斯卡尔(Kruskal)算法求最小生成树
查看>>
leetcode -- 11. 盛最多水的容器
查看>>
android学习笔记35——AnimationDrawable资源
查看>>
全栈爬取-Scrapy框架(CrawlSpider)
查看>>
一个牛逼的着色器学习网站-shadertoy
查看>>
sdnu 1172.Queue 【LIS】
查看>>
Android 查看蓝牙hci日志
查看>>
Sparkcore高级应用一
查看>>
vim vimtutor
查看>>
Jmeter学习笔记12-监听器以及测试结果的分析
查看>>
ASP.NET Core中使用GraphQL - 第九章 在GraphQL中处理多对多关系
查看>>
Python 开发与测试 Webservice(SOAP)
查看>>
结对第一次—原型设计(文献摘要热词统计)
查看>>
selenium +python 对table的操作
查看>>