100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > AcWing 9. 分组背包问题(分组背包模板)

AcWing 9. 分组背包问题(分组背包模板)

时间:2023-08-27 17:59:27

相关推荐

AcWing 9. 分组背包问题(分组背包模板)

题目连接

/problem/content/description/9/

思路

对于一个组里面的物品只能选一个我们可以通过集合划分的方式来看待这个问题,f[i][j]f[i][j]f[i][j]表示的是从前i个组中每个组选择一个物品其总容量不超过j的最大价值,那么我们就能用一个三层循环解决这个问题f[i][j]=max(f[i][j],f[i][j−v[i][k]]+w[i][k])f[i][j]=max(f[i][j],f[i][j-v[i][k]] + w[i][k])f[i][j]=max(f[i][j],f[i][j−v[i][k]]+w[i][k])

代码

#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000007#define endl "\n"#define PII pair<int,int>#define INF 0x3f3f3f3fint dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};ll ksm(ll a,ll b) {ll ans = 1;for(;b;b>>=1LL) {if(b & 1) ans = ans * a % mod;a = a * a % mod;}return ans;}ll lowbit(ll x){return -x & x;}const int N = 1e2+10;//----------------自定义部分----------------int t,n,V;int v[N][N],w[N][N],s[N],f[N];void slove(){cin>>n>>V;for(int i = 1;i <= n; ++i) {cin>>s[i];for(int j = 1;j <= s[i]; ++j)cin>>v[i][j]>>w[i][j];}for(int i = 1;i <= n; ++i)for(int j = V;j >= 0; --j)for(int k = 1;k <= s[i]; ++k)if(j >= v[i][k])f[j] = max(f[j],f[j-v[i][k]] + w[i][k]);cout<<f[V]<<endl;}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);t = 1;while(t--){slove();}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。