C++实现7-55 0-1背包 分数 20 作者 陈晓梅 单位 广东外语外贸大学 给定n(n<=100)种物品和一个背包。物品i的重量是wi(wi<=100),价值为vi(vi<=100),背包的容量为C(C<=1000)。 应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。 输入格式: 共有n+1行输入: 第一行为n值和c值,表示n件物品和背包容量c; 接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。 输出格式: 输出装入背包中物品的最大总价值。 输入样例: 在这里给出一组输入。例如:
时间: 2023-10-25 11:33:30 浏览: 105
下面是C++的参考代码实现:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int N = 110, M = 1010;
int w[N], v[N], dp[M];
int main()
{
int n, C;
cin >> n >> C;
for (int i = 1; i <= n; i++)
cin >> w[i] >> v[i];
for (int i = 1; i <= n; i++)
for (int j = C; j >= w[i]; j--)
dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
cout << dp[C] << endl;
return 0;
}
```
其中,使用dp[j]表示容量为j的背包所能得到的最大价值。对于状态转移方程,需要特别注意循环的顺序,需要先枚举物品i,再枚举容量j,并且内层循环需要从大到小枚举,这样才能保证dp[j-w[i]]表示的是上一层循环中的状态。最终的结果为dp[C],表示容量为C的背包所能得到的最大价值。
相关问题
7-55 0-1背包 分数 20 作者 陈晓梅 单位 广东外语外贸大学 给定n(n<=100)种物品和一个背包。物品i的重量是wi(wi<=100),价值为vi(vi<=100),背包的容量为C(C<=1000)。 应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。 输入格式: 共有n+1行输入: 第一行为n值和c值,表示n件物品和背包容量c; 接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。 输出格式: 输出装入背包中物品的最大总价值。 输入样例: 在这里给出一组输入。例如:
这是一个经典的0-1背包问题,可以使用动态规划算法求解。设dp[i][j]表示将前i个物品装入容量为j的背包中所能获得的最大价值,状态转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
其中w[i]和v[i]分别表示第i件物品的重量和价值。如果第i件物品的重量w[i]大于背包容量j,则第i件物品不能放入背包中,此时dp[i][j]的值应该与dp[i-1][j]相同;否则,第i件物品可以选择放入背包中,此时dp[i][j]的值应该为dp[i-1][j-w[i]]+v[i]。
最终的结果为dp[n][c],表示将n个物品装入容量为c的背包中所能获得的最大价值。
下面是一份参考代码实现:
7-4 输出Fibonacci数列的前n项 分数 15 作者 陈晓梅 单位 广东外语外贸大学 已知Fibonacci数列的规律是1,1,2,3,5,8,…,即数列的前两项是1,其后的每一项都是其前两项的和。输出Fibonacci数列的前n(1<=n<=40
)项。
您可以使用以下代码实现:
```python
n = int(input("请输入要输出的项数:"))
fib = [1, 1] # 初始化前两项
for i in range(2, n):
fib.append(fib[i-1] + fib[i-2]) # 计算新的项并添加到列表中
print("Fibonacci数列的前%d项为:" % n)
for i in range(n):
print(fib[i], end=" ")
```
运行代码后,输入要输出的项数,程序将会输出对应的Fibonacci数列。注意,Fibonacci数列的项数不能超过40,否则计算会非常耗时。
阅读全文