LuoguP1441 砝码称重 解题报告【搜索+背包型DP】
来源:互联网 发布:淘宝定价策略 编辑:程序博客网 时间:2024/05/22 17:23
题目描述
现有
输入输出格式
输入格式:
输入文件weight.in的第1行为有两个整数
第2行有
输出格式:
输出文件weight.out仅包括1个整数,为最多能称量出的重量。
输入输出样例
输入样例#1:
3 1
1 2 2
输出样例#1:
3
说明
【样例说明】
在去掉一个重量为
【数据规模】
对于20%的数据,
对于50%的数据,
对于50%的数据,
对于100%的数据,
解题报告
这道题我们要解决两个问题,一个是处理出去掉m个砝码有多少种方案,第二个是要在一个确定的方案上找出这个方案最多能称出多少重量不同的物品,也就是砝码组合起来有多少种重量不同的情况。
对于第一个问题,我们采用搜索的方法解决,我们的dfs有两个参数,分别是当前搜索到的位置(u)和已经去掉的砝码个数(step)。
有两个显然的终止条件,一个是
一个搜索到的点u,他的下一个状态(u+1)有去掉它和不去掉它两种选项,由此我们就要分别写两个dfs分开搜索。
对于第二个问题,我们采用背包问题的解法来解决。也就是开一个
这样一来,剩下的就很明朗了:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=20,M=2000;int n,m,a[N+5],vmax,ans;bool dp[M+5],flag[N+5];void dfs(int u,int step){ if(step>m)return ; if(u==n+1) { if(step==m) { int tot=0; for(int i=1;i<=vmax;i++)dp[i]=false; for(int i=1;i<=n;i++) { if(flag[i])continue; for(int j=vmax;j>=a[i];j--) if(dp[j-a[i]])dp[j]=true; } for(int i=1;i<=vmax;i++)if(dp[i])tot++; ans=max(ans,tot); } return ; } dfs(u+1,step); flag[u]=1; dfs(u+1,step+1); flag[u]=0;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]),vmax+=a[i]; dp[0]=true; dfs(1,0); printf("%d",ans); return 0;}
阅读全文
0 0
- LuoguP1441 砝码称重 解题报告【搜索+背包型DP】
- 洛谷 1441 砝码称重 搜索+DP 解题报告
- 砝码称重 解题报告
- 砝码称重 解题报告
- 蓝桥杯 砝码称重 递归 解题报告
- 砝码称重(dp)
- 砝码称重问题【dp】
- CodeVS1025 选菜 解题报告【背包型DP】
- ssl1072-砝码称重【dp练习】
- POJ 1702 解题报告——Eva's Balance:用砝码为物体称重
- 【OJ8756】砝码称重V2,可达性多重背包
- f013: 砝码称重 (多重背包化01背包) + 南理工:砝码称重(贪心)
- CodeVS1052 地鼠游戏 解题报告【背包型DP】
- LuoguP1052[NOIP2005] 过河 解题报告【离散化+背包型DP】
- LuoguP1941[NOIP2014] 飞扬的小鸟 解题报告【背包型DP】
- 砝码称重
- 砝码称重
- 砝码称重
- 使用XRecyclerview下拉刷新,上拉加载
- Linux 多线程环境下 进程线程终止函数小结
- android ConstraintLayout基础系列之替换LinerLayout
- Imageloader工具类
- GeekBand笔记-《STL与泛型编程 》 第三周
- LuoguP1441 砝码称重 解题报告【搜索+背包型DP】
- 手机来电翻转静音功能
- Java设计一个用户注册的程序
- 读研总结
- 别的进程中委托显示textbox的文本
- 操作给定的二叉树,将其变换为源二叉树的镜像。
- c++里面出现的关键字
- 编写一个简单的内核模块
- Linux(CentOS6.5)下静默安装oracle11gR2(待完成)