voiddfs(intnow,intc){ //now:当前物品 //c:当前的车辆编号 //剪枝 if(c>=ans){ //如果c超过了ans,则一定不是最优解 return; } if(now-1==n){ //所有的物品都遍历过了,则记录一个cnt数量 ans=min(ans,c); return; } for(inti=1;i<=c;i++){//遍历所有的已经存在的车 if(nums[now]+...
第一种选择不取这个位置的值就去查看下一个位置的值,就对应代码dfs1(arr,k,current+1);,只有状态加一,其余不变。第二种选择取这个位置的值,就将该位置的值存入list中,并获得index。然后调用代码dfs1(arr,k-arr[current],current+1);,可见k的值减去该位置的值,同样状态+1。这题有一个必要的点是要记得...
走格子DFS剪枝经典例题是:一道经典的走格子问题,要求从起点走到终点,每次只能向右或向下走,求有多少种走法。 这道题可以使用深度优先搜索(DFS)解决,同时进行剪枝优化。剪枝优化包括: 如果当前位置已经超过终点,则不可能走到终点,直接返回0。 如果当前位置和前一个位置相同,说明走到了重复的位置,直接返回0。 如果当...
ans=min(ans,c); return; } for (int i=1;i<=c;i++){//遍历所有的已经存在的车 if (nums[now]+car[i]<=k){ //now物品可以放在编号为i的这辆车上 car[i]+=nums[now]; dfs(now+1,c); //下一个物品,仍是当前车 car[i]-=nums[now];//回溯 } } //如果所有的物品都不能放在now这...