| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7348 人关注过本帖, 1 人收藏
标题:试试这样学习C语言
只看楼主 加入收藏
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
[bo]以下是引用 [un]leeco[/un] 在 2008-4-30 18:13 的发言:[/bo]



话说,如果背包容量为N,物品数为M,我可以做到时间O(NM),空间O(N),返回最优解和最优值

请您赐教(是通过递归输出最优解吗?)

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-04-30 18:18
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
滚动数组???

[color=white]
2008-04-30 18:26
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
一个物品集S,如果有S的一个子集S',S'的元素和为C,我就称物品集S可以达到背包大小C。
现在用一个标记数组int flag[MAXC+1];来标记能达到的背包大小,
我们先考虑物品集为空的情况,在一个个地把S的元素加入考虑的物品集
那么开始时,flag[0]=1,flag[i]=0,0<i<=MAXC
然后将一个物品加入考虑中,可以用原来的flag[]生成新的flag[]

如果要生成最优值,可以用flag[]记录这个解是在添加哪个物品的时候得到的。

程序代码:
#include <iostream>
using namespace std;
//int* a ,int n 表示n个物品的物品集
//int C 是背包的大小
//int* x,int& xn 通过这个两个参数返回一个最优解,这里x[]表示达到最优值你要取哪些物品
//return 最优值

const int MAXC=100000;
int knapsackx(int* a,int n,int C,int* x,int & xn)
{
    static int flag[MAXC+1];
    fill(flag,flag+C+1,-1);
    flag[0]=INT_MAX;//大小为0是可以达到的,但没有取任何物品,我就随便赋了一个INT_MAX
    for(int i=0;i<n;i++){
        for(int j=0;j<=C;j++){
            if(flag[j]!=-1 && flag[j]!=i && j+a[i]<=C && flag[j+a[i]]==-1){
                flag[j+a[i]]=i;
            }
        }
    }
         //取得最优值
    int best;
    for(best=C;flag[best]==-1;best--);
         //生成最优解
    xn=0;
    int r=best;
    while(r){
        x[xn++]=flag[r];
        r-=a[flag[r]];
    }
         //将x[]翻转
    for(int i=0;i<xn/2;i++){
        swap(x[i],x[xn-1-i]);
    }
    return best;
}

int main()
{
    int a[]={1,3,5,7,4};
    int x[10],xn;
    int best=knapsackx(a,5,14,x,xn);
    printf("最优值=%d\n",best);
    printf("可以取如下编号的物品来达到最优值:");
    for(int i=0;i<xn;i++){
        printf("%d ",x[i]);
    }    
    printf("\n");
    system("pause");
}


[[it] 本帖最后由 leeco 于 2008-4-30 19:19 编辑 [/it]]
2008-04-30 19:06
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
感谢楼上的代码,谢谢指教

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-04-30 19:19
ryophoenix
Rank: 1
来 自:重庆
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-10-16
收藏
得分:0 
已经做了太监了.....
2008-05-01 12:00
水龙吟
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-5-1
收藏
得分:0 
楼主想在沉默中爆发?
2008-05-01 18:46
enirilt
Rank: 1
等 级:新手上路
帖 子:126
专家分:0
注 册:2006-11-29
收藏
得分:0 
我也顶
我是从4月30日决定好好学C语言的,呵呵
2008-05-02 22:06
快速回复:试试这样学习C语言
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024496 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved