部分和问题
妈的能学会是一会,等会一定要思考一下怎么增加和解决这个方面的问题。
一,问题描述,
给定整数a1,a2,a3,a4,判断是否可以从中挑选出若干数,使它们的和恰好为k;
二,分析
1,作为一个最简单的选数类型题目。还是挺能看出来你垃圾的。我一定要费曼。
2,dfs里面还是挺体现挺多东西的。
3,我先把状态再细分一下,sum是总和,depth算是深度其实也就是选到第几个数。
不行你这样算啥状态呢?一点都不严谨!应该是sum是当前总和,depth是当前选到第几个数。
比如你从dfs(0,0)开始就是当前总和为0,当前选到第0个数。
4.明白道理,自己独立写一遍,再来费曼是一个道理的东西。
(对了话要拷贝一个)
5,额你这错的挺离谱的,不过错的话应该是对状态的理解上错了。
这个课本让我有点疑惑。。。
也不怪人家,人家估计都是从0开始的
所以要注意了。
6,代码
1 #include<iostream> 2 using namespace std; 3 int n,k,a[10005]; 4 int dfs(int sum,int depth) 5 { 6 if(depth==n) return sum==k; 7 8 if(dfs(sum,depth+1)) return true; 9 if(dfs(sum+a[depth],depth+1)) return true; 10 11 return false; 12 } 13 int main(){ 14 cin>>n>>k; 15 for(int i=0;i<n;i++) 16 cin>>a[i]; 17 if(dfs(0,0)) cout<<"Yes"<<endl; 18 else cout<<"No"<<endl; 19 20 }
7,mark
8,费曼。要给别人讲懂才算。
这费曼也不是简单的费曼啊