zoukankan      html  css  js  c++  java
  • bzoj4145 [AMPPZ2014]The Prices(状压dp)

    Description

    你要购买m种物品各一件,一共有n家商店,你到第i家商店的路费为d[i],在第i家商店购买第j种物品的费用为c[i][j],
    求最小总费用。

    Input

    第一行包含两个正整数n,m(1<=n<=100,1<=m<=16),表示商店数和物品数。
    接下来n行,每行第一个正整数d[i](1<=d[i]<=1000000)表示到第i家商店的路费,接下来m个正整数,
    依次表示c[i][j](1<=c[i][j]<=1000000)。

    Output

    一个正整数,即最小总费用。

    Sample Input

    3 4
    5 7 3 7 9
    2 1 20 3 2
    8 1 20 1 1

    Sample Output

    16

    HINT

    在第一家店买2号物品,在第二家店买剩下的物品。

     
    蠢了……这么裸的状压dp都没看出来……
    设$dp[i][j]$表示在前$i$个商店里,买的东西的状态为$j$时的最小花费
    然后每一个商店跑一下背包就可以啦
     1 //minamoto
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
     5 int n,m,lim,c[105][21],d[105],dp[105][(1<<16)+5];
     6 int main(){
     7 //    freopen("testdata.in","r",stdin);
     8     scanf("%d%d",&n,&m),lim=1<<m;
     9     for(int i=1;i<=n;++i){
    10         scanf("%d",&d[i]);
    11         for(int j=1;j<=m;++j) scanf("%d",&c[i][j]);
    12     }
    13     memset(dp,0x3f,sizeof(dp));
    14     dp[0][0]=0;
    15     for(int i=1;i<=n;++i){
    16         for(int j=0;j<lim;++j) dp[i][j]=dp[i-1][j]+d[i];
    17         for(int j=1;j<=m;++j)
    18         for(int k=0;k<lim;++k)
    19         if(~k&(1<<j-1)) cmin(dp[i][k|(1<<j-1)],dp[i][k]+c[i][j]);
    20         for(int j=0;j<lim;++j) cmin(dp[i][j],dp[i-1][j]);
    21     }
    22     printf("%d
    ",dp[n][lim-1]);
    23     return 0;
    24 }
  • 相关阅读:
    slice()与splice()
    apply和call函数
    参数arguments
    获取用户当前位置并设为中心点
    数组中元素为对象形式的去重
    判断浏览器环境(微信、支付宝)
    h5车牌号输入键盘
    点击事件的延迟
    jQuery修改伪元素
    webSocket认识
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9787776.html
Copyright © 2011-2022 走看看