背包问题解题思路

题目描述:

 

 这个问题解决起来也不是很难,在这里,我们设定一组数据供以测试,

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数组设定为输入读取*

posted @ 2022-01-18 17:18  冯子坤  阅读(71)  评论(0编辑  收藏  举报