// #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432 // 本题其实我觉得C++题解中的第一个会更好,但是他的dp数组改为bool型会更好理解 #include <bitset> #include <iostream> #include <vector> using namespace std; int main() { bitset<20005> dp;//----------可简单理解成更省空间的布尔型数组 int v, n; cin >> v >> n; vector<int> nn(n); for (int i = 0; i < n; i++){ cin >> nn[i]; } dp[0] = 1; for (int i = 0; i < n; i++){ for (int j = v; j >= nn[i]; j--){//---------因为后面的数据更新依赖上一轮的前面的数据所以,从后往前递归 dp[j] = dp[j] || dp[j - nn[i]];//---------若dp[j]为 <true> 则表示,只考虑前i个物体,可以组合出空间j } } for (int i = v; i >= 0; i--) if (dp[i]){ cout << v - i; return 0; } return 0; } // 64 位输出请用 printf("%lld")