设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,...,wn。问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。如果有满足条件的选择,则此背包有解,否则此背包问题无解。给出C++代码
时间: 2023-05-14 18:07:24 浏览: 62
0-1背包问题.java给定背包的容量c,物品数量n、物品重量的集合w[n]和物品价值的集合v[n]; 2... 设有n种物品,
5星 · 资源好评率100%
以下是一个简单的背包问题的 C 代码实现:
```
#include <stdio.h>
#include <stdbool.h>
bool canFill(int S, int n, int weights[]) {
bool dp[S+1];
for (int i = 0; i <= S; i++) {
dp[i] = false;
}
dp[0] = true;
for (int i = 0; i < n; i++) {
for (int j = S; j >= weights[i]; j--) {
dp[j] = dp[j] || dp[j-weights[i]];
}
}
return dp[S];
}
int main() {
int S = 10;
int n = 4;
int weights[] = {2, 3, 5, 7};
if (canFill(S, n, weights)) {
printf("This backpack has a solution.\n");
} else {
printf("This backpack has no solution.\n");
}
return 0;
}
```
这个代码使用了动态规划的思想,通过一个布尔型数组 dp 来记录能否填满每个重量。首先初始化 dp[0] 为 true,表示背包重量为 0 时一定可以填满。然后对于每个物品,从大到小遍历每个重量,如果当前重量减去当前物品的重量可以填满,则当前重量也可以填满。最后返回 dp[S],表示背包重量为 S 时能否填满。
阅读全文