(由于先看的最后一题,然后又一直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; }