有N个货币,将其放入M个背包,使价值最大的背包和价值最小的背包的差值最小。 输入 第一行两个整数N,M .下一行N个整数,表示货币的价值。 输出 一行一个整数,表示最小的差距 的代码
时间: 2023-03-31 16:03:16 浏览: 51
已知有n中物品和一个可容纳M质量的背包,每种物品i的质量为Wi,假定将物品i放入背包,可以得到Pi的效益,求使背包中物品总效益最大的背包方案。
5星 · 资源好评率100%
我可以回答这个问题。这是一个经典的背包问题,可以使用动态规划来解决。首先,将货币按照价值从大到小排序。然后,定义一个二维数组dp[i][j]表示前i个货币放入j个背包时,最小的差距。初始状态为dp[][]=,dp[][j]=INF(j>),dp[i][]=INF(i>),其中INF表示正无穷大。接下来,使用状态转移方程dp[i][j]=min(dp[i-1][j], dp[i-1][j-1]+val[i]-val[i-1]),其中val[i]表示第i个货币的价值。最终答案为dp[N][M]。以下是代码实现:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = x3f3f3f3f;
const int MAXN = 1005;
int dp[MAXN][MAXN];
int main()
{
int N, M;
cin >> N >> M;
int val[MAXN];
for (int i = 1; i <= N; i++)
cin >> val[i];
sort(val + 1, val + N + 1, greater<int>());
memset(dp, INF, sizeof(dp));
dp[][] = ;
for (int i = 1; i <= N; i++)
{
dp[i][] = INF;
for (int j = 1; j <= M; j++)
dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]+val[i]-val[i-1]);
}
cout << dp[N][M] << endl;
return ;
}
阅读全文