选择我自己的算法

来源:互联网 发布:java开源bug管理系统 编辑:程序博客网 时间:2024/05/04 22:53

终于调出来了,18ms
粘个题解>>http://codevs.cn/problem/1268/

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;int w,d,v,num[50],a,b = 0;bool ok = 0;void dfs(int s,int c){    if(ok) return;    if(pow(b,w - c + 1) < s) return;// 最优化剪枝     if(s < 0) return;//可行性剪枝     if(c == w) {if(s == 0)ok = 1;return;}//只能使用w - 1个符号     for(int i = d;i >= 1;i --)    {        dfs(s - num[i],c + 1);//由于+和*不方便剪枝,采取 - 和 / 的方式         if(num[i]&&s >= num[i]&&s % num[i] == 0)            dfs(s / num[i],c + 1);    }}int main(){    scanf("%d%d",&w,&d);    for(int i = 1;i <= d;i ++)        scanf("%d",&num[i]),b = max(b,num[i]);    scanf("%d",&v);    for(int i = 1;i <= v;i ++)    {        ok = 0;        scanf("%d",&a);        if(pow(b,w + 1) < a);//若最大值全使用乘法也得不到解说明不可能有解         else            dfs(a,-1);//使用的数字比运算个数多一个。         if(ok)  puts("Y");        else    puts("N");    }}