用递归和递推解决01背包问题

记忆化搜索(递归)

#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int a[N], arr[N][N], b[N];
int n;
int m = 0;
int dfs(int i, int lv)//arr—储存已经遍历过的情况
{
	if (arr[i][lv] != -1)return arr[i][lv];
	if (i == n)return 0;
	int dfs1 = 0, dfs2 = 0;
	if (lv >= a[i])
		dfs1 = dfs(i + 1, lv - a[i]) + b[i];
	dfs2=dfs(i + 1, lv);
	return arr[i][lv] = max(dfs1, dfs2);
}
int main()
{
	memset(arr, -1, sizeof(arr));
	int v; cin >> n>>v;//n表示物品数量,v表示背包大小。
	for (int i = 0; i < n; i++)cin >> a[i] >> b[i];//a—表示所占空间大小,b—表示价值

	cout << dfs(0,v) << endl;
	return 0;
}

递推

#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int a[N], b[N], arr[N][N];
int main()
{
    int n, v;
    cin >> n >> v;
    for (int i = 0; i < n; i++)cin >> a[i] >> b[i];
    for (int i = 1; i <= n; i++)//arr[i][j]表示背包体积为j时前i个物品,装下的最大价值。
    {
        for (int j = 1; j <= v; j++)
        {
            if(j<a[i-1])
              arr[i][j]=arr[i-1][j];
             else
               arr[i][j]=max(arr[i-1][j],arr[i-1][j-a[i-1]]+b[i-1]);
        }
    }
    cout << arr[n][v] << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值