I

题目大意


给你n个数,让你用这n个数在组成k的情况下,找到所有的value,这些value也由这n个数组成,且这些value组合在一起能够组成k


解法


看到题目我的想法就是母函数= =不过wa了,后来发现因为母函数能找到这n个数所能形成的所有情况,但是可能两种情况是包含关系的。比如3,3,6这个数据可以形成6和9但是如果k是15的时候,你就不能得到因为9是由6生成的
dp[i][j]表示在和为i的情况下,能否得到j
那么当dp[i][j] = 1时,dp[i][j + c[k]]比然能得到,dp[i+c[k]][j+c[k]]也能得到。


C++代码

/**
6 18
5 6 1 10 12 2
dp[i-c[i]][k] -> dp[i][k],dp[i][k+c[i]]
*/

#include<bits/stdc++.h>
using namespace std;

int a[555];
int res[1000000];
int dp[555][555];
int main(){
    int n , m ;
    cin >> n >> m;
    for(int i = 1; i <= n ; i++){
        cin >> a[i];
    }
    sort(a+1,a+1+n);
    dp[0][0] = 1;
    for(int i = 1;i <= n ; i++){
        for(int j = m;j >= a[i];j --){
            for(int k = 0;k + a[i]<= m;k ++){
                if(dp[j - a[i]][k]) dp[j][k] = dp[j][k+a[i]] = 1;
            }
        }
    }
    int tot = 0;
    for(int i = 0;i <= m; i ++) if(dp[m][i]) res[tot++] = i; 
    printf("%d
",tot);
    for(int i = 0;i < tot;i ++) printf("%d ",res[i]);
}
 
原文地址:https://www.cnblogs.com/DWVictor/p/11219002.html