acwing278.数字组合

acwingn128数字组合

原题链接:https://www.acwing.com/problem/content/280/

思路

01背包

image
(图片来源https://www.acwing.com/solution/content/52801/)

状态表示:
	集合:f[i][j]表示从前i个数中选,和为j的所有集合
	属性: 方案的数量sum
	
状态转移:(集合划分)
		选第i个数 => f[i-1][j - value[j]]
		不选第i个数 => f[i-1][j] 

边界处理:f[0][0] = 1

然后优化为一维即可(参考题目与打卡题解)

代码
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 10010;

int f[N];
int w[N];

int main()
{
    int n,m;
    cin >> n >> m;
    
    for(int i = 1; i <= n;i ++) cin >> w[i];
    
    f[0] = 1;
    
    for(int i = 1; i <= n; i ++)
    {
        for(int j = m; j >= w[i]; j --)
        {
            f[j] += f[j - w[i]];
        }
    }
    
    cout << f[m] ;
    
    return 0;
}
posted @ 2022-09-13 21:00  r涤生  阅读(16)  评论(0编辑  收藏  举报