CH5201 数组组合【01背包】

2021-05-16 00:27

阅读:405

标签:问题   def   c++   这一   个数   ons   一个   typedef   部分   

5201 数字组合 0x50「动态规划」例题

描述

在N个数中找出其和为M的若干个数。先读入正整数N(1

输入格式

第一行是两个数字,表示N和M。
第二行起是N个数。

输出格式

就一个数字,表示和为M的组合的个数。

样例输入

4 4
1 1 2 2

样例输出

3

 

思路:

非常基础的01背包问题 dp[i][j]为前i个数选出和为j的若干个数的方案数

实际上i的这一维是不需要的,因为i+1都是在i的基础上做的

采用倒序循环,循环到j时,后半部分j~m处于第i阶段,前半部分处于第i-1阶段

 1 #include  2 #include 3 #include 4 #include
 5 #include 6 #include 7 #include 8 
 9 #define inf 0x3f3f3f3f
10 using namespace std;
11 typedef long long LL;
12 
13 int n, m;
14 const int maxn = 105;
15 int v[maxn], dp[10005];
16 
17 int main()
18 {
19     scanf("%d%d", &n, &m);
20     for(int i = 0; i ){
21         scanf("%d", &v[i]);
22     }
23 
24     memset(dp, 0, sizeof(dp));
25     dp[0] = 1;
26     for(int i = 0; i ){
27         for(int j = m; j >= v[i]; j--){
28             dp[j] += dp[j - v[i]];
29         }
30     }
31     printf("%d\n", dp[m]);
32     return 0;
33 }

 

CH5201 数组组合【01背包】

标签:问题   def   c++   这一   个数   ons   一个   typedef   部分   

原文地址:https://www.cnblogs.com/wyboooo/p/9750264.html


评论


亲,登录后才可以留言!