Advertisement

回溯法

阅读量:

已知一组正整数a0、a1、……、an-1,从中挑选若干数值,使其总和恰好等于k,目标是确定满足条件的选取元素数量最少的方案

/*#include "stdio.h"
#define MAXN 10
int n=10; //共有10个数值
int k=19;
int minsize=10;
int w[]={4,6,8,9,10,12,13,15,3,7};

int x[MAXN]; //用于存储最优解

void dispasolution()
{ printf("最优装载策略为:\n");
for(int i=1;i<=n;i++)
if(x[i]!=0)
printf("选择第%d个数值\n",i);
printf("所选总数为%d\n",minsize);
}

void dfs(int i,int tw,int tv,int op[])
{ if (i>n) //抵达叶子节点
{ if (tw==k && tv<minsize) //发现更优解,进行更新保存
{ minsize=tv;
for (int j=1;j<=n;j++)
x[j]=op[j];
}
}
else //尚未遍历完所有元素
{
if (tw+w[i-1]<=k) { //左剪枝处理逻辑

全部评论 (0)

还没有任何评论哟~