P5365 [SNOI2017]英雄联盟

原题链接

考察:多重背包dp

思路:

        多重背包板子,然后注意压掉一重循环需要倒序体积....

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 typedef long long LL;
 6 const int N = 626,M = 2010;
 7 int n,k[N],c[N];
 8 LL m,sum,f[M*N];
 9 int main()
10 {
11     scanf("%d%lld",&n,&m);
12     for(int i=1;i<=n;i++) scanf("%d",&k[i]);
13     for(int i=1;i<=n;i++) scanf("%d",&c[i]),sum+=k[i]*c[i];
14     if(!m) {puts("0"); return 0;} 
15     f[0] = 1;
16     for(int i=1;i<=n;i++)
17       for(int j=sum;j>=0;j--)
18         for(int s=1;s<=k[i]&&s*c[i]<=j;s++)
19             f[j] = max(f[j-s*c[i]]*s,f[j]);
20     for(int i=1;i<=sum;i++) 
21       if(f[i]>=m) {printf("%d\n",i); return 0;} 
22     return 0;
23 }

 

posted @ 2021-04-01 01:35  acmloser  阅读(64)  评论(0编辑  收藏  举报