喵喵的转化为01背包问题,将该模型转化成一个容量为s的背包,s为最开始正面朝上数的和,有N 个物品,每个物品的体积为b i − a i ,代价为1,请你求出如何用最小的代价来填满背包。同时去掉ai==bi的情况。这样就把01 0101背包转化成了多重背包。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int M = 2e5 + 5; const ll INF = (1ll << 32); const int inf=0x3f3f3f3f; const ll mod = 1e9 + 7; int n,m,a,b; void solve() { cin>>n>>m; map<int,int>mp; ll sum=0; for(int i=1;i<=n;i++){ int a,b; cin>>a>>b; sum+=a; mp[b-a]++; } vector<int>dp(m+1,inf); dp[sum]=0; for(auto it : mp){ int d=it.first; int c=it.second; if(d==0) continue; int x=1; while(c){ //用一个二进制优化过的多重背包 x=min(x,c); int k=d*x; if(d>0){ for(int i=m;i>=k;i--){ dp[i]=min(dp[i],dp[i-k]+x); } } else{ for(int i=0;i-k<=m;i++){ dp[i]=min(dp[i],dp[i-k]+x); } } c=c-x; x=x*2; } } for(int i=0;i<=m;i++){ if(dp[i]!=inf){ cout<<dp[i]<<endl; } else cout<<"-1"<<endl; } return; } int main() { int t = 1; // cin >> t; while (t--) { solve(); } return 0; }
abc-269 G - Reversible Cards 2
最新推荐文章于 2024-08-23 15:15:47 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)