动态规划01背包问题入门学习,详细笔记,推荐阅读

问题描述:

给定N种物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大??

在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入多次,也不能只装入物品的一部分。因此,该问题被称为0-1背包问题。

 

 

 

 建议读者可以先把代码段复制在devc++编辑器上,再手机打开csdn保存图片阅读,创作不易,您的每一个点赞,关注,评论都是对作者的最大支持,谢谢。

#include<stdio.h>
int V[200][200];//前i个物品装入容量为j的背包中获得的最大价值
int max(int a,int b)//比较两个数大小的自定义子函数 
{
   if(a>=b)
       return a;
   else return b;
}
 
int KnapSack(int n,int w[],int v[],int x[],int C)//KnapSack英文名为背包,我称它为背包函数 
{//n是输入的物品数 w是物品重量数组 v是物品价值数组 x是用于判断拿取物品的数组 C为背包最大容纳量  
    int i,j;
	//填表,其中第一行和第一列全为0 
    for(i=0;i<=n;i++)
        V[i][0]=0;
    for(j=0;j<=C;j++)
        V[0][j]=0;
    for(i=1;i<=n;i++)
	{
		printf("%d  %d  %d  ",i,w[i-1],v[i-1]);
        for(j=1;j<=C;j++)
		{
            if(j<w[i-1]) //背包装不下物品的第一种情况 
			{
				V[i][j]=V[i-1][j];
				printf("[%d][%d]=%2d  ",i,j,V[i][j]);
			}
			
            else//背包能够装下当前物品,但还需要考虑  拿 与  不拿  的两种情况 
			{//核心思想 背包的状态转换方程 
                V[i][j]=max(V[i-1][j],V[i-1][j-w[i-1]]+v[i-1]);
				printf("[%d][%d]=%2d  ",i,j,V[i][j]);
			}
		}
		printf("\n");
	}
	//判断哪些物品被选中
            j=C;
            for(i=n;i>=1;i--)//用标记的方法判断物品是否被装入背包 
            {
            if(V[i][j]>V[i-1][j])
                {
					x[i]=1;
					j=j-w[i-1];
                }
            else
                x[i]=0;
            }
            printf("选中的物品是:\n");
            for(i=1;i<=n;i++)
                printf("%d ",x[i]);
            printf("\n");
        return V[n][C];
        
}
 
void main()
{
    int s;//获得的最大价值
    int w[15];//物品的重量
    int v[15];//物品的价值
    int x[15];//物品的选取状态
    int n,i;
    int C;//背包最大容量
    n=5;
    printf("请输入背包的最大容量:\n");
    scanf("%d",&C);
    
    printf("输入物品数:\n");
    scanf("%d",&n);
    printf("请分别输入物品的重量:\n");
    for(i=0;i<n;i++)
        scanf("%d",&w[i]);
 
    printf("请分别输入物品的价值:\n");
    for(i=0;i<n;i++)
        scanf("%d",&v[i]);
 
    s=KnapSack(n,w,v,x,C);
 
    printf("最大物品价值为:\n");
    printf("%d\n",s);
   
    
}

转载:学习(18条消息) 动态规划解0-1背包问题(C语言版)_baidu_20363843的博客-CSDN博客_0-1背包问题c语言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值