# 废话不多说,直接上代码
**0-1背包问题**
原题链接:——>[0-1背包问题](https://www.dotcpp.com/oj/problem1924.html "0-1背包问题")
```c
#include int main()
{
int n,max;//n表示物品个数,max表示背包容量
scanf("%d%d", &n, &max);
int weight[n];//存储物品重量的数组
int value[n];//存储物品价值的数组
int i = 0;
while(i< n){
scanf("%d%d", &weight[i], &value[i]);
i++;
}
int opt[n+1][max+1];//存储每一步选择后的最大价值,即opt[i][w]表示当可选物品为i个,背包容量为w时,所能背的最大价值
for(int i = 0; i<=max; i++){//当n=0,即可选择的物品为0时,无论背包容量再大,此时的最大价值也为0,因为此时没有物品可装
opt[0][i] = 0;
}
for(int i = 0; i<=n; i++){//当max=0,即背包容量为0时,即使有再多可选择的物品,此时的最大价值也为0,因为没有容量的背包装不下任何物品
opt[i][0] = 0;
}
for(int i= 1; i<=n; i++){
for(int w = 1; w<=max; w++){
if(w-weight[i-1] < 0){//当背包容量没有当前物品大时,此时只有一种选择,就是不选
opt[i][w] = opt[i-1][w];
}else{//当背包容量足够容纳当前物品时,此时有两种选择:即装下这个物品和不装这个物品,我们应该取这两种选择所能创造的价值最大的那个
int a = opt[i-1][w-weight[i-1]] + value[i-1];//装下该物品创造的价值
int b = opt[i-1][w];//不装该物品创造的价值
if(a>b){//当装下该物品创造的价值更大时,就选择装下
opt[i][w] = a;
}else{//当不装该物品创造的价值更大时,就选择不装
opt[i][w] = b;
}
}
}
}
printf("%d", opt[n][max]);
return 0;
}
```
**完全背包问题**
原题链接:——>[完全背包问题](https://www.dotcpp.com/oj/problem2132.html "完全背包问题")
0-1背包问题与完全背包问题的区别就是:0-1背包不能重复选择,而完全背包可以重复选择
解题思路与0-1背包完全一样,只需将上述代码做一处小小的改动,即可应用于完全背包问题
即将第30行代码
int a = opt[i-1][w-weight[i-1]] + value[i-1];//装下该物品创造的价值
改成下面即可:
int a = opt[i][w-weight[i-1]] + value[i-1];//装下该物品创造的价值
有问题请留言!!