背包问题中的01背包和完全背包

背包问题(Knapsack problem)

简介:给定N种物品,每件物品有各自的重量Wi,价值Vi,现有一个背包,总容量W,要算出在不超出Wm的情况下,达到最大总价值Vm时各种物品的组合情况。
01背包:每种物品只有一件。
完全背包:每种物品有多件,可以反复使用。

基本思路
用每件物品的价值Vi 除以其重量Wi,得到该物品的单位价值,从单位价值高的物品开始选取,若加上第i件物品后重量不超过Wm,则选取该物品,否则判断下一个物品。在重量达到最大或者物品用完后,输出所选择的物品。

代码实现

01背包
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
        
        
int main()
{
    int n;
    double mm,*m,*v,vv=0,k=0;               //物品件数 n,容量 mm,总价值 vv,物品重量 m[i],物品价值 v[i]
    scanf("%lf",&mm);
    scanf("%d",&n);
    m=(double *)malloc(n*sizeof(double));
    v=(double *)malloc(n*sizeof(double));
    int i,j,*pb,y;                          //pb用来记录该物品编号
    double t,*pa;                           //pa用来记录该物品的单位价值
    pa=(double *)malloc(n*sizeof(double));
    pb=(int *)malloc(n*sizeof(int));
    for(i=0;i
        
        
       
       
      
      
     
     


完全背包
  完全背包中显示出每种物品用了多少件
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
        
        
int main()
{
    int n;
    double mm,*m,*v,vv=0,k=0;
    scanf("%lf",&mm);
    scanf("%d",&n);
    m=(double *)malloc(n*sizeof(double));
    v=(double *)malloc(n*sizeof(double));
    int i,j,*pb,y;
    double t,*pa;
    pa=(double *)malloc(n*sizeof(double));
    pb=(int *)malloc(n*sizeof(int));
    for(i=0;i
        
        
       
       
      
      
     
     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值