多重背包【链表写法】

    描述请参照上一篇 http://blog.sina.com.cn/s/blog_979e38fc010149me.html
具体代码:
#include
#define N 20


typedef struct data
{
int w,c;
struct data *pre;
}Data;

int W[N],C[N],n,m,now;
Data st[10000005];

Data *node;
void init()
{
now=0;
st[now].pre=NULL;
node=&st[now++];
int i;
for(i=0;i
for(i=0;i
}

void Check(int w,int c)//用链表模拟01背包的过程
{
Data *h1,*h2;
h1=node;
h2=node;
while(h1->pre!=NULL)
{
h1=h1->pre;
if(h1->w+w<=m)
{
while(h2->pre->w>h1->w+w)
{
h2=h2->pre;
}
if(h2->pre->w==h1->w+w)
{
if(h2->pre->cc+c)
{
h2->pre->c=h1->c+c;
}
}
else
{
Data *t;
st[now].pre=NULL;
t=&st[now++];
t->w=h1->w+w;
t->c=h1->c+c;
t->pre=h2->pre;
h2->pre=t;
h2=t;
}
}
}
}
void make()
{
Data *h;
st[now].pre=NULL;
h=&st[now++];
h->w=0;
h->c=0;
node->pre=h;
int i,j,k;
for(i=0;i
{
j=i+1;
k=1;
while(k<=j)//二进制压缩
{
j-=k;
Check(k*W[i],k*C[i]);
k*=2;
}
if(j)
{
Check(j*W[i],j*C[i]);
}
}
int Max=-1;
while(node->pre!=NULL)//查找
{
h=node;
node=node->pre;
if(node->c>Max)Max=node->c;
}
printf("%d\n",Max);
}

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
make();
}
return 0;
}
    这一次的代码明显比上一次的好,但是还是很遗憾,有缺陷!!!
    总结:
    经过上两次的实现,相比之下链表的效率要高很多,遍历队列时间复杂度是(O(nlog(n))),插入是log(n)。而链表的遍历是O(n),而插入的时间复杂度O(1)(在均摊的情况下)。但是还是避免不了就是内存不足,加上数据背包容量大一点的话,还是有超时的冒险,不过数据小的话,应该比数组模拟要快一点。接下来就是找解决这个题的动态规划算法。。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值