CF687C The Values You Can Make(dp)

这道题可以设计状态位前i个,用了j块构造k,取j块中的x块这样的状态

有点01背包的意思,每个钱可取可不取,对于j,x都是如此

对于第二维,我们考虑是否取第i个,而对于第三维,我们考虑在第二维是否取得情况下,第三维是否取

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
const int mod=1e9+7;
bool f[510][510][510];
vector<int> num;
int main(){
    int n,k;
    cin>>n>>k;
    int i,j,l;
    f[0][0][0]=1;
    for(i=1;i<=n;i++){
        int a;
        cin>>a;
        for(j=0;j<=500;j++){
            for(l=0;l<=j&&l<=k;l++){
                if(f[i-1][j][l]||(j>=a&&(f[i-1][j-a][l]))||(j>=a&&l>=a&&(f[i-1][j-a][l-a])))
                    f[i][j][l]=1;
            }
        }
    }
    for(i=0;i<=k;i++){
        if(f[n][k][i]){
            num.push_back(i);
        }

    }
    int sign=(int)num.size();
    cout<<sign<<endl;
    for(auto x:num){
        cout<<x<<" ";
    }
    cout<<endl;
}
View Code

 

posted @ 2020-04-26 15:52  朝暮不思  阅读(159)  评论(0编辑  收藏  举报