部分和问题

妈的能学会是一会,等会一定要思考一下怎么增加和解决这个方面的问题。

一,问题描述,

给定整数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,费曼。要给别人讲懂才算。

这费曼也不是简单的费曼啊

posted @ 2019-12-30 20:05  北月真好  阅读(218)  评论(1编辑  收藏  举报