博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
caioj 1087 动态规划入门(非常规DP11:潜水员)(二维背包)
阅读量:6273 次
发布时间:2019-06-22

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

这道题的难点在于价值可以多。

这道题我一开始用的是前面的状态推现在的状态
实现比较麻烦,因为价值可以多,所以就设最大价值
为题目给的最大价值乘以10

#include
#include
#include
#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 1123;const int MAXM = 112;int f[MAXN][MAXN], n, m1, m2;int a[MAXN], b[MAXN], w[MAXN];int main(){ scanf("%d%d%d", &m1, &m2, &n); REP(i, 0, n) scanf("%d%d%d", &a[i], &b[i], &w[i]); int ans = 1e9; memset(f, 0x3f, sizeof(f)); f[0][0] = 0; REP(i, 0, n) for(int j = m1 * 10; j >= a[i]; j--) for(int k = m2 * 10; k >= b[i]; k--) { f[j][k] = min(f[j][k], f[j-a[i]][k-b[i]] + w[i]); if(j >= m1 && k >= m2) ans = min(ans, f[j][k]); } printf("%d\n", ans); return 0;}

然后后来发现好像用当前更新后来的状态是更方便的

只需要在超过最大价值的时候取最大价值就好了。

#include
#include
#include
#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 1123;const int MAXM = 112;int f[MAXN][MAXN], n, m1, m2;int a[MAXN], b[MAXN], w[MAXN];int main(){ scanf("%d%d%d", &m1, &m2, &n); REP(i, 0, n) scanf("%d%d%d", &a[i], &b[i], &w[i]); memset(f, 0x3f, sizeof(f)); f[0][0] = 0; REP(i, 0, n) for(int j = m1; j >= 0; j--) for(int k = m2; k >= 0; k--) { int t1 = min(m1, j + a[i]), t2 = min(m2, k + b[i]); f[t1][t2] = min(f[t1][t2], f[j][k] + w[i]); } printf("%d\n", f[m1][m2]); return 0;}

 

转载于:https://www.cnblogs.com/sugewud/p/9819412.html

你可能感兴趣的文章
Google FireBase - fcm 推送 (Cloud Messaging)
查看>>
BBS论坛(二十七)
查看>>
html DOM 的继承关系
查看>>
装饰器的邪门歪道
查看>>
Dubbo常用配置解析
查看>>
【转】C#解析Json Newtonsoft.Json
查看>>
macports的安装及常用命令
查看>>
(转)使用C#开发ActiveX控件
查看>>
spring mvc 基于注解 配置默认 handlermapping
查看>>
半小时学会上传本地项目到github
查看>>
Android学Jni/Ndk 开发记录(一)
查看>>
Linux Tcl和Expect的安装
查看>>
WPF中的依赖项属性(转)
查看>>
linux防火墙相关 iptables
查看>>
最简单的单例模式
查看>>
JPopupMenu的使用以及JPopupMenu中子组件的事件处理
查看>>
从反汇编的角度看引用和指针的区别
查看>>
拓马长枪定乾坤
查看>>
UIProgressView的详细使用
查看>>
Silverlight实用窍门系列:70.Silverlight的视觉状态组VisualStateGroup
查看>>