需要用到01背包的知识点
把书的总价-包邮的限=背包的最大重量
01背包
暴力解法:
回溯算法枚举
动态规划:
明确dp数组的定义:dp[i][j] 0-i下标的物品任取放到容量为j的背包中
不放物品i,为dp[i-i][j]
放物品i,为dp[i-1][j-weight[i]]+value[i]
dp[i][j]=max(dp[i-i][j],dp[i-1][j-weight[i]]+value[i])
dp[i][j]的初始化要考虑题目
遍历顺序:
for( )物品
for( )背包//顺序可以颠倒
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 35,M= 300005;
int dp[N][M] = { {0} };
int main() {
int n, x;
cin >> n >> x;
int price[N] ;
int sum = 0;
for (int i = 1; i <= n; i++) {
cin >> price[i];
sum += price[i];
}
int result = sum - x;//背包的最大价值
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= result; j++) {
dp[i][j] = dp[i - 1][j];
if(j>=price[i])
dp[i][j] = max(dp[i-1][j], dp[i - 1][j - price[i]] + price[i]);
}
}
cout << sum - dp[n][result];
return 0;
}