P1164

https://www.luogu.org/problemnew/show/P1164

/*
dfs写法:
白书上有个问题,n个数,任意取,加和,能否等于k。
把白书的代码改一下就是这个了
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>

#define INF 0x3f3f3f3
using namespace std;
typedef long long LL;
const int maxn=1e2+5;
int N,M,a[maxn],ans;
void dfs(int i,int sum)
{
    if(i==N+1)
    {
        if(sum==M)ans++;
        return ;
    }
    if(sum>M)
        return ;
    dfs(i+1,sum+a[i]);
    dfs(i+1,sum);
}
int main()
{
    scanf("%d%d",&N,&M);
    for(int i=1; i<=N; i++)
        scanf("%d",&a[i]);
    dfs(1,0);
    printf("%d\n",ans);
    return 0;
}
/*
dp
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>

#define INF 0x3f3f3f3
using namespace std;
typedef long long LL;
const int maxn=1e2+5;
int N,M,a[maxn],ans,dp[maxn*10];

int main()
{
    scanf("%d%d",&N,&M);
    for(int i=1; i<=N; i++)
        scanf("%d",&a[i]);
    dp[0]=1;
    for(int i=1;i<=N;i++)
        for(int j=M;j>=a[i];j--)
            dp[j]+=dp[j-a[i]];
    printf("%d\n",dp[M]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41646772/article/details/82527767
今日推荐