BZOJ 4145 AMPPZ2014 The Prices 状压DP

来源:互联网 发布:大数据电信应用教程 编辑:程序博客网 时间:2024/05/17 06:31

题目大意:给定n个商店和m种物品,你需要每种物品买一个,去第i个商店的路费是di,第i个商店出售第j种物品的价格是ci,j,求最小花销
fi,j表示当前已经考虑了前i个商店,购买的状态为j的最小花销
然后每个商店内跑个背包即可
时间复杂度O(nm2m)

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,m;int c[110][20],d[110],f[110][1<<16];int main(){    int i,j,k;    cin>>n>>m;    for(i=1;i<=n;i++)    {        scanf("%d",&d[i]);        for(j=1;j<=m;j++)            scanf("%d",&c[i][j]);    }    memset(f,0x3f,sizeof f);    f[0][0]=0;    for(i=1;i<=n;i++)    {        for(j=0;j<1<<m;j++)            f[i][j]=f[i-1][j]+d[i];        for(k=1;k<=m;k++)            for(j=0;j<1<<m;j++)                if(~j&(1<<k-1))                    f[i][j|(1<<k-1)]=min(f[i][j|(1<<k-1)],f[i][j]+c[i][k]);        for(j=0;j<1<<m;j++)            f[i][j]=min(f[i][j],f[i-1][j]);    }    cout<<f[n][(1<<m)-1]<<endl;    return 0;}
0 0