洛谷 P5020货币系统

https://www.luogu.com.cn/problem/P5020

思路是把货币从小到大排序,然后按顺序依次完全背包dp,每次dp检查i-1种面值的货币能不能凑出第i种货币
做完看了看,这个思路始终进行着令人尴尬的重复,但是懒得改了
然后去题解看了看发现没有比这还麻烦的方法
.
最后四个样例数据范围比较大,但应该都不是需要时间特别长的,而是卡一些技巧。
80分代码:修改一(不是亿)点点就可以满分

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
typedef long long LL;
typedef std::pair<int ,int> PP;
const int N = 25005,M = 105;
int dp[N],val[M],kik[M];
int n,m,t,cnt;
int main()
{scanf("%d",&t);while(t--){memset(dp,0,sizeof(dp));memset(kik,0,sizeof(kik));scanf("%d",&n);for(int i=0; i<n; i++){scanf("%d",&val[i]);}std::sort(val,val+n);for(int i=1; i<n; i++){for(int j=0; j<i; j++){if(kik[j]) continue;for(int k=val[j]; k<=val[i]; k++){dp[k] = std::max(dp[k],dp[k-val[j]]+val[j]);}}if(dp[val[i]] == val[i]) kik[i] = 1;}cnt = 0;for(int i=0; i<n; i++){if(!kik[i]){cnt += 1;}}printf("%d\n",cnt);}return 0;
}

TEL原因是 仅仅在for i 的一层循环中检查是否剔除面值i,做了很多无用功。
修改:
在for j的一层循环中,若出现面值i已经被凑出来,则不用把循环全部进行完,退出循环即可。这样可以节省一些时间
做出该修改后得分95,还是未AC
于是又在每次dp面值i之前先检查之前是否出现过可以被面值i整除的面值,有的话直接剔除,终于AC
AC代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
typedef long long LL;
typedef std::pair<int ,int> PP;
const int N = 25005,M = 105;
int dp[N],val[M],kik[M];
int n,m,t,cnt;
int main()
{scanf("%d",&t);while(t--){memset(dp,0,sizeof(dp));memset(kik,0,sizeof(kik));scanf("%d",&n);for(int i=0; i<n; i++){scanf("%d",&val[i]);}std::sort(val,val+n);for(int i=1; i<n; i++){for(int j=0; j<i; j++){if(val[i]%val[j] == 0){kik[i] = 1;break;}}if(kik[i]) continue;for(int j=0; j<i; j++){if(kik[j]) continue;for(int k=val[j]; k<=val[i]; k++){dp[k] = std::max(dp[k],dp[k-val[j]]+val[j]);}if(dp[val[i]] == val[i]) break;}if(dp[val[i]] == val[i]) kik[i] = 1;}cnt = 0;for(int i=0; i<n; i++){if(!kik[i]){cnt += 1;}}printf("%d\n",cnt);}return 0;
}

洛谷 P1757 通天之分组背包

https://www.luogu.com.cn/problem/P1757
分组背包

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
typedef long long LL;
typedef std::pair<int ,int> PP;
const int N = 1005,M = 105;int m,n,w,v,g,gg;
struct Item
{int value,weight;
}gr[N][N];
int num[N],mp[N];
int dp[N];
int idx;int main()
{scanf("%d%d",&m,&n);for(int i=0; i<n; i++){scanf("%d%d%d",&w,&v,&g);if(!mp[g]) mp[g] = ++idx;gg = mp[g];gr[gg][num[gg]].weight = w;gr[gg][num[gg]].value  = v;num[gg] += 1;}for(int i=1; i<=idx; i++){for(int j=m; j>=0; j--){for(int k=0; k<num[i]; k++){if(j >= gr[i][k].weight){dp[j] = std::max(dp[j],dp[j-gr[i][k].weight]+gr[i][k].value);}}}}printf("%d",dp[m]);return 0;
}

洛谷 P1064 [NOIP2006 提高组] 金明的预算方案

https://www.luogu.com.cn/problem/P1064

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
typedef long long LL;
typedef std::pair<int ,int> PP;
const int N = 3.2e4+5,M = 105;
int va[N],ww[N],ex[N][3],zhu[N],dp[N];
int n,m,z,idx,tv,tz,tf,tf2;int main()
{scanf("%d%d",&m,&n);for(int i=1; i<=n; i++){scanf("%d%d%d",&va[i],&ww[i],&z);if(z) {ex[z][0] += 1;ex[z][ex[z][0]] = i;}else{zhu[++idx] = i;}}for(int i=1; i<=idx; i++){tz = zhu[i];for(int j=m; j>=0; j--){tv = va[tz];if(j >= tv) dp[j] = std::max(dp[j],dp[j-tv]+ww[tz]*va[tz]);if(ex[tz][0]){tf = ex[tz][1];tv = va[tz] + va[tf];if(j >= tv) dp[j] = std::max(dp[j],dp[j-tv]+ww[tz]*va[tz]+ww[tf]*va[tf]);}if(ex[tz][0] >= 2){tf2 = ex[tz][2];tv = va[tz]+va[tf2];if(j >= tv) dp[j] = std::max(dp[j],dp[j-tv]+ww[tz]*va[tz]+ww[tf2]*va[tf2]);tv += va[tf];if(j >= tv) dp[j] = std::max(dp[j],dp[j-tv]+ww[tz]*va[tz]+ww[tf2]*va[tf2]+ww[tf]*va[tf]);}}}printf("%d",dp[m]);return 0;
}

洛谷 P5322 [BJOI2019]排兵布阵

分组背包
用dp[i] 记录总共派出i个人的时候,最大的得分
1.准备

想办法构造一个cas[][]数组 记录第i个城堡可以打败j个玩家时刚好需要多少兵力。
这样我们可以认为,每个城堡为一组,每一组中有s个数据分别为:在城堡i,分别打败1,2,3…s个玩家[花费的兵力,得到的分数]

2.开始套分组背包模板

->for [1,2,3,4…n] 枚举所有的n个城堡:
…->for[m,m-1…3,2,1] 倒序枚举派遣总人数:
…/…->for[1,2,3,4…s] 枚举每个城堡的s组数据:
…/…/…->dp[w] = std::max(dp[w], dp[w-cost]+gain);

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
typedef long long int LL;
const int INF = 0x7fffffff, SCF = 0x3fffffff;
const int N = 105, M = 2e4+4, MOD =  1000000007;
int ssa[N][N];//every enemy's solders send to castle i;
int cas[N][N];//min solders number you send when you can beat j player at castle i;
int dp/*[N]*/[M];//max score you gain when castle = i and solders = j
int s,n,m,v;
int main()
{scanf("%d%d%d",&s,&n,&m);for(int i=1; i<=s; i++){for(int j=1; j<=n; j++){scanf("%d",&ssa[j][i]);}}for(int i=1; i<=n; i++){std::sort(ssa[i]+1,ssa[i]+s+1);}for(int i=1; i<=n; i++){for(int j=1; j<=s; j++){int num = (ssa[i][j]<<1)+1;cas[i][j] = num;if(num > m) break;}}//for(int i=0; i<M; i++) dp[i] = -SCF;//dp[0] = 0;for(int i=1; i<=n; i++){for(int w=m; w>=0; w--){for(int j=0; j<=s; j++){int gain = i*j, cost = cas[i][j];if(w-cost < 0) break;dp[w] = std::max(dp[w], dp[w-cost]+gain);}}}printf("%d",dp[m]);return 0;
}

【背包DP练习】洛谷 P5020货币系统 P1757通天之分组背包 P1064[NOIP2006 提高组]金明的预算方案 P5322 [BJOI2019]排兵布阵相关推荐

  1. 信息学奥赛一本通 1844:【06NOIP提高组】金明的预算方案 | 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案

    [题目链接] ybt 1844:[06NOIP提高组]金明的预算方案 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 [题目考点] 1. 动态规划:分组背包 2. 动态规划:依赖背包 ...

  2. 洛谷P5322 [BJOI2019] 排兵布阵 题解

    洛谷P5322 [BJOI2019] 排兵布阵 题解 题意:小 C 正在玩一款排兵布阵的游戏.在游戏中有 n n n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m m m 名士兵,可以向第 ...

  3. 洛谷 P5322 [BJOI2019]排兵布阵

    P5322 [BJOI2019]排兵布阵 题目大意:玩游戏~~,对于 n 个城堡,有 m 个士兵可以分别派遣到这些城堡. 同时我们有 s 个对手,在每个城堡都会与每个玩家单独比拼,在第 i 个城堡与每 ...

  4. 依赖背包dp NOIP2006 vijos 1313 金明的预算方案

    依赖背包: 简化的问题 这种背包问题的物品间存在某种"依赖"的关系.也就是说,物品i依赖于物品j,表示若选物品i,则必须选物品j.为了简化起见,我们先设没有某个物品既依赖于别的物品 ...

  5. 洛谷P5322 [BJOI2019]排兵布阵【分组背包】

    题目描述 小 C 正在玩一款排兵布阵的游戏.在游戏中有 n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m 名士兵,可以向第 i 座城堡派遣 a_i名士兵去争夺这个城堡,使得总士兵数不超过 ...

  6. CSP 2021考前每日2题(10-2)洛谷 P5020 货币系统 + USACO2021铜组 Uddered but not Herd

    文章目录 P5020 [NOIP2018 提高组] 货币系统 USACO : Uddered but not Herd P5020 [NOIP2018 提高组] 货币系统 #include <c ...

  7. 洛谷—P5020 货币系统(背包问题)

    这道题目一开始没想到是个背包问题,后来想到了但是没有优化TL了,原因还是没有深刻理解填表法的过程. 80分代码: #include<bits/stdc++.h> using namespa ...

  8. 不止代码:洛谷P1064 金明的预算方案+P2014选课(依赖背包)

    文章目录 题目描述 总结 解析 解法1 解法2 代码 解法3 代码 题目描述 金明的预算方案 选课 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是, ...

  9. 洛谷 P1757 通天之分组背包

    P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品 ...

最新文章

  1. 个推CTO安森:我所理解的数据中台
  2. java 在线监测 trace_JDK自带的性能调优监测工具使用示例
  3. 记录:自制的小说推荐程序(一)
  4. 软件工程师不可不知的10个概念
  5. Android 4.0新增Space及GridLayout初谈
  6. java未检查异常_Java中已检查和未检查的异常
  7. java se和java_Java:改进了Java SE 6和Java SE 7的客户端和桌面部分!
  8. 计算机网上作业系统论文,网上作业提交系统的设计与实现
  9. Check Point CEO:“我们正在积极寻找收购目标”
  10. Python常见问题解决记录1-Non-ASCII character ‘\xe7‘错误
  11. python的发展生态_简说Python生态系统的14年演变
  12. C++primer 7.4节练习
  13. c语言ascii码16进制,C语言附录ASCII码表.doc
  14. 使用pyinstaller打包python源代码生成exe程序
  15. php和plc哪个难,致PLC初学者的入门一课,七大误区如何解决?
  16. Fastadmin中的语言加载机制
  17. word中突然有一行文字间距特别大的解决办法
  18. 互联网产品运营管理知识一网打尽
  19. Python3.7.4入门-0/1To Begin/数据类型与结构
  20. java实现小球的碰撞

热门文章

  1. linux下C++编程学习
  2. 在 CentOS 7.6 上打包 Android Package APK
  3. MD5、SHA1、SHA256、SHA512
  4. 全球首个5G火车站落户上海虹桥!
  5. 高级安全Windows防火墙管理单元无法加载。请重新启动正在管理的计算机上的Windows防火墙服务,报错代码:0x6D9
  6. python--批量离线安装python包
  7. PMSG直驱式永磁同步风力发电机,包含MPPT转速双PI,转矩,并网模型等等多种控制,DFIG双馈风力发电机等等。
  8. Laravel数据快速填充
  9. android手机如何设置提高网速,安卓手机网速慢怎么办 安卓手机网速慢解决办法【详解】...
  10. java wms erp自动化立体仓库管理系统 进出库 源码 源代码 程序