有点无语,考试的时候居然就没有想出来?现在重写一次就写出来了。。。
定义
为前
个物品中,花费为
是否可行(
存储布尔值),则有
![dp[i][j] = dp[i][j] || (dp[i-1][j] || dp[i-1][j-cost[i]])](https://1000bd.com/contentImg/2024/04/19/adddd4539babbb42.png)
空间复杂度上还可以通过滚动数组优化(因为一次过了,就不想改了🤡)。
- #include
-
- using namespace std;
-
- int n, x;
- int cost[31];
- bool dp[31][300010];
- int main() {
- cin >> n >> x;
- int sum = 0;
- for (int i = 1; i <= n; i++) {
- cin >> cost[i];
- sum += cost[i];
- }
- for (int i = 0; i <= n; i++) dp[i][cost[i]] = true;
- for (int i = 1; i <= n; i++) {
- for (int j = 0; j <= sum; j++) {
- if (j < cost[i]) dp[i][j] = dp[i][j] || dp[i - 1][j];
- else dp[i][j] = dp[i][j] || (dp[i - 1][j] || (dp[i - 1][j - cost[i]] && 1));
- }
- }
- int ans = -1;
- for (int i = x; i <= sum; i++) {
- if (dp[n][i]) {
- ans = i;
- break;
- }
- }
- cout << ans << '\n';
- return 0;
- }