The Prices
1220 ワード
The Prices
タイトルの説明
あなたは(m)種類の物品を1件ずつ購入して、全部で(n)軒の商店があって、あなたは第(i)軒の商店までの旅費は(d[i])、第1軒の商店で第(j)種類の物品を購入する費用は(c[i][j])で、最小の総費用を求めます.
入力フォーマット
最初の行は、2つの正の整数(n,m(1<=n<=100,1<=m<=16))を含み、商店数と物品数を表す.
次の(n)行は、各行の最初の正の整数(d[i](1<=d[i]<=100000))が(i)店までの旅費を表し、次の(m)個の正の整数が、(c[i][j](1<=c[i][j]<=100000))の順に表される.
出力フォーマット
正の整数、すなわち最小総費用.
サンプル
サンプル入力
サンプル出力
問題解(m≦16)、まず状圧dpを思い浮かべる. 定義:(dp[i][j])は前(i)の店を表し、買い物の状態が(j)のときの最小費用を表す. は、依存リュックサックと類似しており、具体的にはコードを参照してください.
code
タイトルの説明
あなたは(m)種類の物品を1件ずつ購入して、全部で(n)軒の商店があって、あなたは第(i)軒の商店までの旅費は(d[i])、第1軒の商店で第(j)種類の物品を購入する費用は(c[i][j])で、最小の総費用を求めます.
入力フォーマット
最初の行は、2つの正の整数(n,m(1<=n<=100,1<=m<=16))を含み、商店数と物品数を表す.
次の(n)行は、各行の最初の正の整数(d[i](1<=d[i]<=100000))が(i)店までの旅費を表し、次の(m)個の正の整数が、(c[i][j](1<=c[i][j]<=100000))の順に表される.
出力フォーマット
正の整数、すなわち最小総費用.
サンプル
サンプル入力
3 4
5 7 3 7 9
2 1 20 3 2
8 1 20 1 1
サンプル出力
16
問題解
code
#include
typedef long long LL;
const int maxn=(1<<16)+5;
int dp[105][maxn],a[105][20],d[105];
void Solve(){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&d[i]);
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
}
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
int Max=1<