题目大意:给定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;
}
时间: 2024-10-09 06:11:59