怎样在工商局网站做公示/百度seo新站优化
题目链接:https://cn.vjudge.net/contest/174268#problem/F
大致题意:有n个敌人,每个敌人有一定的血量,你可以随意选择杀人的目标,直到杀完所有人为止,你开的第一枪对敌人的伤害为1点,但是在你杀完一个人后可以用被杀的人的武器去杀其他人,每个人的武器对不同的敌人伤害不同,问你杀完所有人你要开枪的最少次数。
题目思路:状压DP入门题,DP[ i ]:状态为j时最少的开枪次数。
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef __int64 ll;
#define inf 1000000000
#define mod 1000000007
#define maxn 100006
#define lowbit(x) (x&-x)
#define eps 1e-10
int a[20],dp[(1<<15)+100],b[20][20];
int main(void)
{int T,i,j,cases=0,n,k;scanf("%d",&T);while(T--){memset(dp,127,sizeof(dp));scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);dp[1<<i]=a[i];}for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%1d",&b[i][j]);for(i=1;i<(1<<n);i++){for(j=0;j<n;j++){if(i&(1<<j))continue;dp[i|(1<<j)]=min(dp[i]+a[j],dp[i|(1<<j)]);for(k=0;k<n;k++){if((i&(1<<k))==0)continue;int tmp=inf;if(b[k][j]>0){int tmp=a[j]/b[k][j]+(a[j]%b[k][j]!=0);dp[i|(1<<j)]=min(dp[i|(1<<j)],dp[i]+tmp);}}}}printf("Case %d: %d\n",++cases,dp[(1<<n)-1]);}return 0;
}