題意: 有n種技能,每種技能只能用一次,怪物有m點血,問最少需要多少種技能可以把怪物殺死。 每種技能有兩個數值a和b,a表示攻擊力,b表示當怪物的血量小於等於b時,這種技能的攻擊力可以變為2a。 一點攻擊力可以殺掉怪物一點血。 簡單深搜 加了一個剪枝後從 421 MS 瞬間 降到 93MS code:
#include <stdio.h>
#include <string.h>
struct node {
int M, spell;
} a[11];
int hp, n;
int vis[11];
int ans ;
void dfs(int k, int HP) {
int i;
if(k>=ans) return ;
if(HP<=0) {
if(ans>k)
ans = k;
return;
}
for(i=1; i<=n; i++)
if(!vis[i]) {
vis[i] = 1;
HP<=a[i].M? dfs(k+1,HP-a[i].spell*2): dfs(k+1,HP-a[i].spell);
vis[i] = 0;
}
}
int main() {
int i;
while(~scanf("%d%d",&n,&hp)) {
for(i=1; i<=n; i++)
scanf("%d%d",&a[i].spell,&a[i].M);
ans = 12;
memset(vis,0,sizeof(vis));
dfs(0,hp);
if(ans !=12) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
struct node {
int M, spell;
} a[11];
int hp, n;
int vis[11];
int ans ;
void dfs(int k, int HP) {
int i;
if(k>=ans) return ;
if(HP<=0) {
if(ans>k)
ans = k;
return;
}
for(i=1; i<=n; i++)
if(!vis[i]) {
vis[i] = 1;
HP<=a[i].M? dfs(k+1,HP-a[i].spell*2): dfs(k+1,HP-a[i].spell);
vis[i] = 0;
}
}
int main() {
int i;
while(~scanf("%d%d",&n,&hp)) {
for(i=1; i<=n; i++)
scanf("%d%d",&a[i].spell,&a[i].M);
ans = 12;
memset(vis,0,sizeof(vis));
dfs(0,hp);
if(ans !=12) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}