1.选择困难症
刷题链接
https://ac.nowcoder.com/acm/problem/13594
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
int count=0;
int temp;
int N,M;
int data[6][100];
void dfs(int cur,int num){
if((cur>M) && (num==N)){
count++;
return;
}
if(num>=N){
return;
}
int cnt=0;
while(data[num][cnt]!=0){
cur+=data[num][cnt];
dfs(cur, num+1);
cur-=data[num][cnt];
cnt++;
}
dfs(cur,num+1);
}
int main(){
while(cin>>temp){
N=temp;
cin>>M;
int tempnum;
for(int i=0;i<N;i++){
cin>>tempnum;
for(int j=0;j<tempnum;j++){
cin>>data[i][j];
}
}
dfs(0,0);
cout<<count<<endl;
count=0;
memset(data, 0, sizeof(data));
}
return 0;
}
这是我自己写的 但是只能通过测试用例 不能AC
2.贝伦卡斯泰露
刷题链接
https://ac.nowcoder.com/acm/problem/14132
这道题的解法说实话 没看懂
这是人家的AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=45;
int a[N];
int a1[N],a2[N];
int n;
bool dfs(int x,int y,int id){
if(x>n/2||y>n/2) return false;
if(id==n+1) return true;
if(a[id]==a1[y+1]){
a2[y+1]=a[id];
if(dfs(x,y+1,id+1)) return true;
}
a1[x+1]=a[id];
return dfs(x+1,y,id+1);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
a1[1]=a[1];
if(dfs(1,0,2)) printf("Frederica Bernkastel\n");
else printf("Furude Rika\n");
}
}
3.数的划分
刷题链接
https://ac.nowcoder.com/acm/problem/16695
完全自己写的 AC80%
不知道剩下是哪儿的问题 但是我觉得用牛客刷题是极好的 至少无限接近真题 或者说就是真题
而且需要用AC率来检测问题
#include<iostream>
#include<vector>
using namespace std;
int n,k;
int count=0;
void dfs(int cur,int sum,int start){
if(sum==n && cur>k){
count++;
return;
}
if(cur>k){
return;
}
for(int i=start;i<n;i++){
if(sum+i<=n){
sum+=i;
dfs(cur+1,sum,i);
sum-=i;
}
}
}
int main(){
cin>>n>>k;
dfs(1,0,1);
cout<<count<<endl;
return 0;
}