【解析】
这也是我自己第一次刷到dfs的题,不过这题在dfs中应该算是入门题了,话不多说,先上代码吧。
#include<iostream>
#include<cstdio>
using namespace std;
int m,n,ans = 0,a[30];//a[21]就是WA,a[30]就AC了
void dnf(int oj,int k){
if( oj == 0 ) {
ans++;
return;
}
if( oj < 0 || k > n ) return;
dnf(oj-a[k],k+1);
dnf(oj,k+1);
return ;
}
int main(){
while(~scanf("%d%d",&n,&m)){
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
ans = 0;
dnf(m,1);
printf("%d\n", ans);
}
return 0;
}
//这道题快把我气吐了。。。真的无语。一直AC不了,各个地方就检查了个遍,没想到最后问题出在数组a的范围上,一开始a[21]的时候一直WA,换了个a[30]就AC了,可是题目里说的时物品不超过20个,这样子用a[21]是毫无问题的,气哭我的杭电OJ
这道题就是用一个函数dnf(和dns就差一个字母,缅怀童年的dnf)去遍历数组a,第一次先从下标为1的开始,第二次从下标为2的开始。。。。每一次遍历中如果数组a的累加刚好达到m的话,那么计数器就+1,然后退出这次遍历,这样最后就能得到答案啦啦啦啦啦啦啦啦啦啦啦。。。。。
这道题就是找规律嘛,具体过程不细致地讲解了,反正就是得出
当n为奇数时,ans = (n+1)*(2*n*n+3*n-1)/8;当n为偶数时,ans = n*(n+2)*(2*n+1)/8。嗯,就是这样,下面是具体代码。
#include<iostream>
#include<cstdio>
using namespace std;
int sum(int n){
if( n % 2 != 0 ) return (n+1)*(2*n*n+3*n-1)/8;
else return n*(n+2)*(2*n+1)/8;
}
int main(){
int n;
while(scanf("%d",&n) != EOF){
cout<<sum(n)<<endl;
}
}
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
string a;
cin>>n;
while(n){
n--;
cin>>a;
string c = a + a;
reverse(c.begin(),c.end());
if(strstr(c.c_str(),a.c_str())) cout<<"YES";
else cout<<"NO";
}
}
这道题至今不知道为啥AC不了,用了好多种方法都不行,最后去网上找blog,发现和我写的基本一样的。。。然后就把他们的复制上去。。还是AC不了,所以。。我心安理得地认为不是自己的锅啦。
【这道题一开始想用动态规划解决,但没啥思路,后来无聊到画画,最后发现有个规律,只要马主把马的四个方位都围住,那马就走不出去了哈哈哈。
#include<stdio.h>
#include<math.h>
int main () {
int a[101][3],n,m,k,flag;
while(~scanf("%d%d%d",&n,&m,&k))
{
flag=0;
if(k==0)printf("NO\n");
else {
for(int i=1;i<=k;i++)
scanf("%d%d",&a[i][1],&a[i][2]);
for(int i=1;i<=k;i++)
{
if(a[i][1]<=5)
{
printf("YES\n");
flag=1;
break;
}
if((n-a[i][1])<=4)
{
printf("YES\n");
flag=1;
break;
}
if(a[i][2]<=5)
{
printf("YES\n");
flag=1;
break;
}
if((m-a[i][2])<=4)
{
printf("YES\n");
flag=1;
break;
}
}
if(flag==0) printf("NO\n");
}
}
return 0;
最后,我们一起学一波猫叫吧,“嘤嘤嘤”。