BZOJ3312 不找零(状压DP)
来源:互联网 发布:算法导论 附加部分答案 编辑:程序博客网 时间:2024/05/29 07:02
题目链接:BZOJ 3312
题目大意:
按顺序买 N个物品(1 <= N <= 100,000),第i个物品花费c(i),(1<=c(i)<=10,000),用K(1<=K<=16)个面值的范围是 1..100,000,000 硬币支付。购买过程中,可随时停下来付款,每次付款只用一个硬币,支付从上一次支付后到现在的这些所有物品的价格(如果钱够)。如果硬币面值大于所需的费用,不找零。计算买完N个物品后最多剩下多少钱。无法支付所有物品则输出-1。
题解:看K的范围,状压DP。把使用硬币的情况压起来,算出每一种硬币使用情况S下最多能支付前多少件物品dp[S]。思路比较好理解,实现细节详见代码。
code
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;inline int read(){ char c=getchar(); int num=0,f=1; while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); } while (c<='9'&&c>='0') { num=num*10+c-'0'; c=getchar(); } return num*f;}long long s[100005],dp[100005],tot,ans;int n,m,k[17];int main(){ m=read(); n=read(); for (int i=0;i<m;i++) k[i]=read(),tot+=k[i]; // tot总钱数 for (int i=1;i<=n;i++) s[i]=read(),s[i]+=s[i-1]; //s[]物品价格前缀和 int all=(1<<m)-1; //这里S和i的循环顺序可以保证dp[S^(1<<i)]的计算先于dp[S] for (int S=0;S<=all;S++) //每一种状态 for (int i=0;i<m;i++) if ((S>>i)&1) //如果使用了第i枚硬币,假定最后一次用的是第i枚 { long long x=dp[S^(1<<i)]; // 用i之前能付多少 x=upper_bound(s+x,s+n+1,k[i]+s[x])-s-1; //现在能付多少 dp[S]=max(dp[S],x); //更新答案 } ans=1e17; for (int S=0;S<=all;S++) if (dp[S]==n) { long long res=0; for (int i=0;i<m;i++) if ((S>>i)&1) res+=k[i]; ans=min(res,ans); } if (ans>tot) puts("-1"); else printf("%lld",tot-ans); return 0;}
阅读全文
0 0
- BZOJ3312 不找零(状压DP)
- [bzoj3312][Usaco2013 Nov][DP]No Change不找零
- bzoj3312[Usaco2013 Nov]No Change不找零
- bzoj3312[Usaco2013 Nov]No Change 状压DP
- 硬币找零(dp)
- nyoj995硬币找零(dp)
- nyoj 硬币找零 995 (DP++技巧)
- NYOJ 995 硬币找零(dp)
- nyoj955硬币找零【dp】
- dp 硬币找零问题
- 【解题报告】uva674_Coin Change(硬币找零, dp, 完全背包)
- 硬币找零-记忆化搜索(DP动态规划)
- 51nod 1101 找零问题 dp (01背包问题)
- nyoj 995硬币找零(dp)递推
- [DP]FJSDFZOJ 1282 硬币找零
- 找零
- 找零
- 找零
- 10-11面经
- SDUT 2463 学密码学一定得学程序
- QT初次
- Restful Api写法心得之一《路径定义篇》
- placeholder属性 点击文本框,输入值默认提示内容消失
- BZOJ3312 不找零(状压DP)
- laravel DB 执行 mysql函数或者字段
- 【矩阵快速幂+矩阵运算性质】Fast Matrix Calculation HDU
- SuperMarketSys超市管理系统(model2版本)
- centos服务器上mysql5.7.19数据库安装
- s5pv210-Linux驱动之USB-HOST主机控制器之EHCI
- Django URL传递参数的方法总结
- 2016 四川省赛F. Floyd-Warshall(LCA + brute force)
- 2-2 Time类的定义