多重背包(二进制优化)

xiaoxiao2021-02-28  47

类似于poj 1014 qduoj

#include<bits/stdc++.h> #define maxn 100007 using namespace std; int mm[20][20]; int dp[maxn]; int v[maxn]; int w[maxn]; int main() { int n,m,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(mm,0,sizeof(mm)); memset(dp,0,sizeof(dp)); int ti,vi; for(int i=0;i<n;i++) { scanf("%d%d",&ti,&vi); mm[ti][vi]++; } int cnt=1; for(int i=1;i<=10;i++) for(int j=1;j<=10;j++) { int tmp = mm[i][j]; for(int k=1;k<=tmp;k<<=1) { v[cnt]=j*k; w[cnt]=i*k; cnt++; tmp-=k; } if(tmp>0) { v[cnt]=j*tmp; w[cnt]=i*tmp; cnt++; } } for(int i=1;i<cnt;i++) for(int j=m;j>=w[i];j--) dp[j]=max(dp[j-w[i]]+v[i],dp[j]); cout<<dp[m]<<endl; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-56482.html

最新回复(0)