HDU 2159
来源:互联网 发布:二值化算法程序 编辑:程序博客网 时间:2024/06/05 09:32
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=300;int n,m,k,s;int a[maxn],b[maxn];int dp[maxn][maxn];int main(){ while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF) { for(int i=1;i<=k;i++) { scanf("%d%d",&a[i],&b[i]); } memset(dp,0,sizeof(dp)); int maxs=-10000; for(int i=1;i<=k;i++) { for(int j=b[i];j<=m;j++) { for(int l=1;l<=s;l++) { dp[j][l]=max(dp[j][l],dp[j-b[i]][l-1]+a[i]); } } } int f=0; for(int i=0;i<=m;i++) { if(f) break; for(int j=0;j<=s;j++) { if(dp[i][j]>=n) { maxs=i; f=1; break; } } } if(f) printf("%d\n",m-maxs); else printf("-1\n"); } return 0;}
很新颖的一个题目啊,用到了二维的背包问题啊,之前背包九讲只看到第三节的多重背包,因为这个问题,又把第五节的二维看了一下,就可以解这个题目了,要注意三重循环因为背包的原型是完全背包问题,因此后两重得要是顺序的顺序来进行读取的,然后就是要特别注意每一重循环的i,j,l的含义是什么,最外层是有几种的物品可以选入。
还要注意就是这个最后是满足经验值后的忍耐值还剩余多少。
而且在后两重的循环里谁先【】【】在哪个先无所谓,无非是一个行列的问题,事实上是一样的。
0 0
- HDU 2159
- HDU 2159
- HDU 2159
- hdu 2159
- hdu 2159
- hdu 2159
- HDU 2159
- HDU 2159
- HDU 2159
- HDU 2159
- hdu 2159
- HDU 2159
- 【HDU】 2159
- hdu 2159 FATE
- hdu 2159 FATE
- hdu 2159 FATE
- HDU 2159 - FATE
- hdu 2159 FATE
- 界面刷新
- Android广播机制
- Activity生命周期和启动模式
- 最长回文子串
- HDU1005 Number Sequence
- HDU 2159
- 简明 Github Pages与 jekyll博客搭建 教程 附 git github参考文档
- 求一个数的所有因子
- gitlab新仓库的创建
- leetcode 347.Top K Frequent Elements
- 网络信息检索效果评价指标体系设计探讨综述
- C++作业6
- 关于今天的电面QUQ
- 《Spring学习笔记》:Spring、Hibernate、struts2的整合前奏