这道题可以设计状态位前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; }