分析:我真是弱的不行。。
设f[i][j]表示前i个商店的购买状态为j的最小花销。。
明显有f[i][j]=f[i-1][j]+d[i];
枚举没有买的物品k,f[i][j|(1<<k-1)]=max(f[i][j]+cost[i][j]);
最后还要看在i商店的买卖是否划算..f[i][j]=min(f[i][j],f[i-1][j]);
using namespace std;
int n,m,s,tot;
int f[105][1<<16],c[105][105],d[105];
int main()
{
scanf("%d%d",&n,&m);
tot=(1<<m)-1;
fo(i,1,n)
{
scanf("%d",&d[i]);
fo(j,1,m)
{
scanf("%d",&c[i][j]);
}
}
memset(f,0x3f,sizeof(f));
f[0][0]=0;
fo(i,1,n)
{
fo(j,0,tot)f[i][j]=f[i-1][j]+d[i];
fo(k,1,m)
{
fo(j,0,tot)
if (~j&((1<<k)-1))
f[i][j|(1<<k-1)]=min(f[i][j|(1<<k-1)],f[i][j]+c[i][k]);
}
fo(j,0,tot)
f[i][j]=min(f[i][j],f[i-1][j]);
}
printf("%d\n",f[n][tot]);
}