1 #include<iostream> 2 #include<map> 3 #include<cstring> 4 using namespace std; 5 6 7 //只需要考虑每个number带来的贡献,不是任何人favorite number的数没有贡献 8 int a[5005],h[15],favorite[505];//favorite[i]为第i个player的favorite number 9 int vis[100005],ans; 10 map<int,int> m1,m2; 11 12 int dp[505][5005];// dp[i][j]为i个人分j个favorite number的最大joy 13 14 int main(){ 15 int n,k; cin>>n>>k; 16 for(int i=1;i<=n*k;i++) { 17 cin>>a[i]; 18 m1[ a[i] ] ++;//这个number一共有多少个 19 } 20 for(int i=1;i<=n;i++){ 21 cin>>favorite[i]; 22 m2[ favorite[i] ]++;//这个number是多少人的favorite 23 } 24 for(int i=1;i<=k;i++) cin>>h[i]; 25 26 for(int i=1;i<=n;i++){ 27 for(int j=0;j<=i*k;j++){ 28 for(int c=0;c<=min(j,k);c++) dp[i][j] = max( dp[i][j],dp[i-1][j-c]+h[c] );//第i个人分c个favorite number 29 } 30 } 31 32 for(int i=1;i<=n;i++){ 33 if( vis[ favorite[i] ] ) continue; 34 ans+=dp[ m2[favorite[i]] ][ min( m2[favorite[i]]*k, m1[ favorite[i]] ) ]; 35 vis[ favorite[i] ] = 1; 36 } 37 38 cout<<ans; 39 40 return 0; 41 }
原文地址:https://www.cnblogs.com/ZhenghangHu/p/9226458.html
时间: 2024-10-14 06:24:06