思路:比赛时没做出来,因为没学状态压缩 但发现大家都用贪心给过了 。。。以dps/hp 排序,先干掉hp小的,dps大的
另一种就是官方的状态压缩DP :用dp[mask]表示杀死mask集合的敌人时,这些敌人造成的最小hp消耗。有转移方程dp[mask]
= min{dp[mask - {i}] + hp_sum[mask] * dps[i], for all i in
mask}
方法1:
#include <stdio.h>
#include <string.h>
int
dp[1<<20],hp[25],dps[25],hp_sum;
int min (int a,int b)
{
> b ? b : a;
}
int count_sum (int x)
//计算出每个x状态的hp的和
{
= 1,ans = 0;
<= x)
if (x&t)
ans += hp[i];
t = t<<1;
i ++;
ans;
}
int main ()
{
n,i;
(~scanf ("%d",&n))
for (i = 1;i <= n;i ++)
scanf
("%d%d",&dps[i],&hp[i]);
memset (dp,0x3f,sizeof(dp));
dp[0] = 0;
for (i = 1;i <(1<<n);i
++)
//遍历所有情况
{
hp_sum = count_sum(i);
int t = 1;
int k = 1;
while (t <= i)
{
if
(t&i)
//i中的某一位为t
dp[i] = min (dp[i],dp[i^t]+hp_sum*dps[k]);
t
k
++;
//k 表示第几个人