C++求解集装箱问题。有n个集装箱要装上一般载重量为W的轮船, 其中集装箱i(1si将尽可能重的集装箱装上轮船,当总重量相同时要求选取的集装箱 个数尽可能少。
时间: 2024-05-11 15:18:06 浏览: 18
这是一个经典的0/1背包问题,可以使用动态规划来解决。
首先定义一个二维数组dp[i][j],表示前i个集装箱,装载容量为j的情况下所选取的集装箱个数的最小值。
初始化时,当j=0时,dp[i][0]=0;当i=0时,dp[0][j]=0。
接下来考虑状态转移方程,对于第i个集装箱有两种选择:选或不选。
如果选第i个集装箱,则dp[i][j]=dp[i-1][j-w[i]]+1;其中w[i]表示第i个集装箱的重量。
如果不选第i个集装箱,则dp[i][j]=dp[i-1][j]。
因此,状态转移方程为:dp[i][j]=min(dp[i-1][j], dp[i-1][j-w[i]]+1)。
最终答案为dp[n][W]。
以下是C++代码实现:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int N = 105, INF = 0x3f3f3f3f;
int n, W;
int w[N];
int dp[N][N * N];
int main()
{
cin >> n >> W;
for (int i = 1; i <= n; i++) cin >> w[i];
memset(dp, INF, sizeof dp);
dp[0][0] = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= N * N; j++)
{
dp[i][j] = dp[i - 1][j];
if (j >= w[i]) dp[i][j] = min(dp[i][j], dp[i - 1][j - w[i]] + 1);
}
}
int ans = 0;
for (int j = 0; j <= N * N; j++)
if (dp[n][j] <= W) ans = j;
cout << ans << endl;
return 0;
}
```