标题: 一个简单的算法题
性别:男-离线 周瑜

栎阳侯谏议大夫

Rank: 16
组别 翰林学士
级别 征西将军
好贴 10
功绩 943
帖子 4717
编号 1808
注册 2003-11-3
家族 瓦岗寨


发表于 2010-11-29 23:53 资料 主页 文集 短消息 看全部作者
我用递归法把程序写出来了,可惜复杂度太高,对于 n=60 无能为力。


顶部
性别:男-离线 周瑜

栎阳侯谏议大夫

Rank: 16
组别 翰林学士
级别 征西将军
好贴 10
功绩 943
帖子 4717
编号 1808
注册 2003-11-3
家族 瓦岗寨


发表于 2010-11-30 00:11 资料 主页 文集 短消息 看全部作者
代码如下,对于最糟糕的情况,28个1中找出总金额和为14的物品,不打印的情况下运行两秒完成,找出40116600种结果。

void printSum(double candidates[], int index[], int n)
{
        for (int i = 0; i < n; i++)
                cout << candidates[index[i]] << " ";
        cout << endl;
}

void getsum_help(double target, double sum, double candidates[], int size, int index[], int n)
{
        if (sum > target)
                return;
        if (fabs(sum-target) <= 1e-6*fabs(target))
                printSum(candidates, index, n);
        int starti = n==0 ? 0 : index[n-1]+1;
        for (int i = starti; i < size; i++)
        {
                index[n] = i;
                getsum_help(target, sum + candidates[i], candidates, size, index, n+1);
        }
}

void getsum(double target, double candidates[], int size)
{
        int *index = new int[size];
        getsum_help(target, 0, candidates, size, index, 0);
        delete []index;
}



顶部
性别:男-离线 周瑜

栎阳侯谏议大夫

Rank: 16
组别 翰林学士
级别 征西将军
好贴 10
功绩 943
帖子 4717
编号 1808
注册 2003-11-3
家族 瓦岗寨


发表于 2010-11-30 00:18 资料 主页 文集 短消息 看全部作者
由于 vi 和 m 都是浮点数,因此也就断绝了我使用动态规划的想法。

上述代码可能的优化包括:
1.先对 candidates 数组进行降序排列,这样前几步更容易得到超过 target 值的和,假设所有价格均为正数,则立即返回。
2.每一步比较当前总和与剩下所有数的和是否比 target 更小,如果更小,则理论上都不可能达到,立即返回。
顶部
性别:男-离线 周瑜

栎阳侯谏议大夫

Rank: 16
组别 翰林学士
级别 征西将军
好贴 10
功绩 943
帖子 4717
编号 1808
注册 2003-11-3
家族 瓦岗寨


发表于 2010-11-30 12:29 资料 主页 文集 短消息 看全部作者
我认为题目没有歧义,从v1到vn的n件商品选择若干件,每件商品都是唯一的,但可能有多件商品价值相等。

如果按照楼上的第一种理解,解题方法也非常相似,把我代码中 starti 处的 +1 去掉即可。

[ 本帖最后由 周瑜 于 2010-11-30 08:42 编辑 ]
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-7-1 05:25
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.009762 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP