(由于先看的最后一题,然后又一直WA,导致这场有点爆炸,我背锅。

A .Fancy Antiques

题意: 选择最多k个商店,买n个物品,每个物品分别对应两个店售卖,求最小花费是多少。n<100,k=m<=40;

思路:搜索。。。。开始以为是个费用流,然后没法限制。加N多减枝,然后....

 

B. 好像没什么可以学的,懒得看了

 

C .Greetings!

pro:N种卡片,用K种格子去装。问浪费的空间。N,K<15

sol:比较小,状态压缩。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int n,k,w[20],h[20],q[20];
long long f[1<<16][20];
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)scanf("%d%d%d",w+i,h+i,q+i);
    memset(f,127,sizeof(f));
    for(int i=0;i<=k;i++)f[0][i]=0;
    for(int i=1;i<(1<<n);i++)
        for(int p=i;p;p=(p-1)&i){
            int maxw=0,maxh=0;long long now=0;
            for(int j=1;j<=n;j++)
                if(1<<(j-1)&p)maxw=max(maxw,w[j]),maxh=max(maxh,h[j]);
            for(int j=1;j<=n;j++)
                if(1<<(j-1)&p)now+=(long long)(maxw*maxh-w[j]*h[j])*q[j];
            for(int j=1;j<=k;j++)
                f[i][j]=min(f[i][j],f[i^p][j-1]+now);
        }
    printf("%lld",f[(1<<n)-1][k]);
    return 0;
}
View Code

相关文章:

  • 2021-08-16
  • 2022-01-16
猜你喜欢
  • 2021-08-14
  • 2021-06-23
  • 2022-01-01
相关资源
相似解决方案