题解:01背包 恰好装满的问题 初始化的时候除了DP[0] 外全部设为不可到达 然后依次累加最后得出结果
#include <iostream> #include<cstdio> #include<cstring> using namespace std; bool dp[20000005]; int main() { int h[22],n,m; while(cin>>n>>m) { int sum=0; for(int i=1; i<=n; i++) { cin>>h[i]; sum+=h[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1; i<=n; i++) for(int j=sum-h[i]; j>=0; j--) if(dp[j]) dp[j+h[i]]=1; int ans; for(int i=m; i<=sum; i++) if(dp[i]) { ans=i; break; } cout<<ans-m<<endl; } return 0; }