背包探索之完全背包

01背包优化为一维数组十分灵活。

#include<stdio.h>
#define NUM 999999	
int f[99005];
int value[2005];
int weight[2005];
int min(int a,int b)
{
	if(a<b)
		return a;
	else 
		return b;
}
int main()
{		

	int T,E,F;
	int i,j,v,n;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&E,&F);
		v=F-E;
		f[0]=0;
		for(i=1;i<=1001;i++)
			f[i]=NUM;
		scanf("%d",&n);
		for(i=1;i<=n;i++)
			scanf("%d%d",&value[i],&weight[i]);
		for(i=1;i<=n;i++)
			for(j=weight[i];j<=v;j++)
				f[j]=min(f[j],f[j-weight[i]]+value[i]);
		if(f[v]==NUM)
				printf("This is impossible.\n");
		else
			printf("The minimum amount of money in the piggy-bank is %d.\n",f[v]);
	}
	return 0;
}


在C++中,完全背包深度优先搜索(DFS,Depth-First Search)通常用于解决组合优化问题,比如0-1背包问题或完全背包问题,其中每个物品都有一个固定的价值和重量,目标是在不超过背包容量的情况下选择物品,使得总价值最大。 以下是使用深度优先搜索解决完全背包问题的基本步骤: 1. **定义状态**:表示当前已选择的物品集合和剩余的背包容量。 2. **状态转移**:对于每个未被选中的物品,判断其是否可以放入当前背包中(即其重量小于等于剩余容量)。如果可以,尝试将该物品加入并更新背包的总价值,然后递归地检查下一个物品。 3. **边界条件**:当所有物品都已考虑过,或者剩余容量不足以容纳任一物品时,返回当前的最佳解决方案。 4. **深度优先搜索**:从空集合开始,通过回溯来探索所有的可能性。 5. **剪枝技巧**:为了防止冗余计算,可以使用记忆化搜索(如动态规划),记录之前已经计算过的最优解。 下面是伪代码形式的示例: ```cpp int dfs(vector<int>& val, vector<int>& wt, int capacity, vector<bool>& selected, int idx = 0) { if (idx == val.size() || capacity <= 0) return 0; // 计算包含当前物品的解 int withItem = val[idx] + dfs(val, wt, capacity - wt[idx], selected, idx + 1); // 不包含当前物品的解 int withoutItem = dfs(val, wt, capacity, selected, idx + 1); // 选择较大的解作为当前节点的最优值 return max(withItem, withoutItem); } // 主函数调用 int knapsackDFS(vector<int> val, vector<int> wt, int cap) { vector<bool> selected(val.size(), false); return dfs(val, wt, cap, selected); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值