动态规划:
01背包
有 NN 件物品和一个容量为 MM 的背包。第 ii 件物品的重量是 WiWi,价值是 DiDi。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
Input
* Line 1: Two space-separated integers: N and M
* Lines 2…N+1: Line i+1 describes charm i with two space-separated integers: Wi and Di
第一行:物品个数 NN 和背包大小 MM。
第二行至第 N+1N+1 行:第 ii 个物品的重量 WiWi 和价值 DiDi。
Output
* Line 1: A single integer that is the greatest sum of charm desirabilities that can be achieved given the weight constraints
输出一行最大价值。
Sample 1
Inputcopy | Outputcopy |
---|---|
4 6 1 4 2 6 3 12 2 7 | 23 |
维度优化代码
const int maxn = 1e6 + 10;
const double EPSILON = 1e-6; // 定义一个小的阈值
int n, m,k;
struct wu
{
int wi;
int vi;
}arr[maxn];
int ans[maxn];
int main()
{
cin >>n>>m;
int flag = 1;
int n1 = n;
while (n1--)
{
struct wu w;
cin >> w.wi >> w.vi;
arr[flag] = w;
flag++;
}
for (int i = 1; i <= n; i++)//外层遍历选的物品个数
{
for (int j = m; j >= arr[i].wi; j--)//内层反向枚举背包重量
{
ans[j] = max(ans[j], arr[i].vi + ans[j - arr[i].wi]);
}
}
cout << ans[m];
return 0;
}