BZOJ2118: 墨墨的等式
2017-09-04 12:00
393 查看
BZOJ2118: 墨墨的等式
完全背包求可行方案数·最短路题解:
http://blog.csdn.net/lych_cys/article/details/50804776核心思想:设其中最小的w是p,设d[i]表示总重量%p=i的最小重量。
放入一个重量为w的物品时,d[i]+w去更新d[(i+w)%p],最短路即可。
另外p不取最小的w正确性没有影响,就是点数多了。
Code:
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #define D(x) cout<<#x<<" = "<<x<<" " #define E cout<<endl using namespace std; typedef long long ll; const ll N = 1e6+5; ll n,p,low,high,a ,d ; bool vis ; ll que(ll x){ ll res=0; for(ll i=0;i<p;i++) if(d[i]<=x){ res+=(x-d[i])/p+1; } return res; } void spfa(){ memset(d,0x3f,sizeof(d)); queue<int> q; q.push(0); d[0]=0; while(!q.empty()){ ll x=q.front(); q.pop(); vis[x]=false; for(ll i=1;i<=n;i++){ ll v=(x+ 4000 a[i])%p; if(d[v]>d[x]+a[i]){ d[v]=d[x]+a[i]; if(!vis[v]){ vis[v]=true; q.push(v); } } } } } int main(){ cin>>n>>low>>high; p=1e6; for(ll i=1;i<=n;i++){ cin>>a[i]; if(!a[i]){ i--;n--;continue; } p=min(p,a[i]); } spfa(); //for(ll i=0;i<p;i++)D(d[i]); E; cout<<que(high)-que(low-1)<<endl; }
相关文章推荐
- BZOJ2118 墨墨的等式
- bzoj2118 墨墨的等式
- bzoj 2118 墨墨的等式 dijkstra
- BZOJ2118墨墨的等式[数论 最短路建模]
- bzoj 2118 墨墨的等式
- 【BZOJ 2118】 2118: 墨墨的等式 (最短路)
- [bzoj2118]墨墨的等式
- bzoj 2118: 墨墨的等式 spfa
- BZOJ-2118 墨墨的等式(好题) 最短路+乱搞
- [图论训练]BZOJ 2118: 墨墨的等式 【最短路】
- [bzoj2118] 墨墨的等式 模数分类 最短路
- BZOJ 2118 墨墨的等式[Waiting]
- BZOJ2118: 墨墨的等式
- BZOJ 2118: 墨墨的等式
- bzoj 2118: 墨墨的等式 最短路建模
- 【BZOJ2118】墨墨的等式(dijkstra)
- 【BZOJ 2118】 墨墨的等式(Dijkstra)
- BZOJ_2118_墨墨的等式_最短路
- 【BZOJ 2118】 墨墨的等式
- BZOJ 2118: 墨墨的等式