很特别的暴力算法
在实际的情况中我们可能会遇到这样的问题
需要遍历n个节点,可是么个节点的方向都不是相同的,因此可以使用下面的方式:总的思想是将他们转化为进制数的问题。也就是说每个节点的进制数不尽相同。
然后从0遍历所有的可能,转化为要求的进制数就可以了。然后判断可能即可。
#include<stdio.h>
int main()
{
int time,i,j,k;
int m,v,tem;
int a[2000],b[2000],c[2000];
int d[2000],e[2000];//jin zhi shu
int w,c1;
scanf("%d",&time);
for(k=0;k<time;k++)
{
int count=0;
scanf("%d%d",&m,&v);
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);// zhongliang
scanf("%d",&b[i]);
if(a[i]>v)
{
count++;
i--;
}
}
int totle=1;
m=m-count;
for(i=0;i<m;i++)
{
c[i]=v/a[i];
totle*=(c[i]+1);
}
for(i=0;i<m;i++)
d[i]=1;
for(i=1;i<m;i++)
{
d[i]=d[i-1]*(c[i-1]+1);
}//jinzhishu chucun end
int max=0;
for(i=0;i<totle;i++)
{
tem=i;
w=0;
c1=0;
for(j=m-1;j>=0;j--)
{
e[j]=tem/d[j];
tem=tem%d[j];
w=w+e[j]*a[j];
c1=c1+e[j]*b[j];
}
if(w==v)
{
if(c1>max)
max=c1;
}
}
if(max==0)
printf("NO\n");
else
printf("%d\n",max);
}
return 0;
}

浙公网安备 33010602011771号