BZOJ 4145 AMPPZ2014 The Prices 状压DP

题目大意:给定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;
}

你可能感兴趣的:(bzoj,状压dp,BZOJ4145)