背包问题解题思路
题目描述:![](https://img2020.cnblogs.com/blog/2729601/202201/2729601-20220118171001532-127905483.png)
这个问题解决起来也不是很难,在这里,我们设定一组数据供以测试,
int v[] = {0, 8, 10, 6, 3, 7, 2}; //初始化物品价值数组 int w[] = {0, 4, 6, 2, 2, 5, 1}; //初始化物品重量数组
先尝试尽量装又小又值钱的东西,再尝试第二的……由此反复,装不下时,在实行动态转移方程:
for(int i=1;i<=n;i++){//嵌套循环行为物品 for(int j=1;j<=c;j++){//列举为循环 if(j<w[i]){//背包装不下的时候 f[i][j]=f[i-1][j];//f为上一个值。 }else{//如果可以拿,使用状态转移方程 f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]); } } }
至此,大框架算是完成了,接下来显出完整代码:
#include <bits/stdc++.h> using namespace std; int f[15][15]; int main() { int v[] = {0, 8, 10, 6, 3, 7, 2}; //初始化物品价值数组 int w[] = {0, 4, 6, 2, 2, 5, 1}; //初始化物品重量数组 int n = 6, c = 12; //设定物品数量与背包容量 memset(f,0,sizeof(f));//初始化f数组为0 for(int i=1;i<=n;i++){//嵌套循环行为物品 for(int j=1;j<=c;j++){//列举为循环 if(j<w[i]){//背包装不下的时候 f[i][j]=f[i-1][j];//f为上一个值。 }else{//如果可以拿,使用状态转移方程 f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]); } } }for(int i=1;i<=n;i++){//打印结果 for(int j=1;j<=c;j++){ cout<<setw(3)<<f[i][j]; }cout<<endl; } }
*如有需求,请将v、w数组设定为输入读取*