NYOJ 311 完全背包【背包问题】

本文通过两个具体的编程题目,分别介绍了完全背包和01背包问题的解决方法,并提供了完整的C语言代码实现。完全背包允许每种物品可以取多个,而01背包则限制每种物品只能取一个。


//完全背包: #include<stdio.h> #include<algorithm> #include<string.h> struct sb { int x,y; }ok[2005]; int main() { int a,b,n,m,v,q; scanf("%d",&q); while(q--) { int yi[50001]={0}; memset(yi,-999999,sizeof(yi));//除yi[0]为0外全部初始化为负无穷。 yi[0]=0; scanf("%d%d",&n,&v); for(a=1;a<=n;a++) scanf("%d%d",&ok[a].x,&ok[a].y); for(b=1;b<=n;b++) { for(m=ok[b].x;m<=v;m++)//一个物品可以拿多次。。 { if(yi[m]<(yi[m-ok[b].x]+ok[b].y)) yi[m]=yi[m-ok[b].x]+ok[b].y; } } if(yi[v]>0)//说明可以正好装满。。 printf("%d\n",yi[v]); else printf("NO\n"); } }
原题链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=311

看这个题,和oj上289的苹果比较一下,看看区别。。修改一下代码就可以ac了!!


//苹果 #include<stdio.h> #include<algorithm> struct sb { int x,y; }ok[1001]; int main() { int a,b,n,m,v; while(1) { int yi[1001]={0}; scanf("%d%d",&n,&v); if(n==0&&v==0) break; for(a=1;a<=n;a++) scanf("%d%d",&ok[a].x,&ok[a].y); for(b=1;b<=n;b++) { for(m=v;m>0;m--)//一个物品只能拿一次。。。 { if(ok[b].x<=m) { if(yi[m]<(yi[m-ok[b].x]+ok[b].y)) yi[m]=yi[m-ok[b].x]+ok[b].y; } } } printf("%d\n",yi[v]); } }


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值