蛮力算法解决问题(c语言)


前言

解决以下问题:
1、背包问题的蛮力解决法
【问题描述】有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且具有最大的价值。
  对下表所示的4个物品求出W=6时的所有解和最佳解。
物品编号	重量	价值

一、实验步骤及结果

#include<stdio.h>
int V[100][100];
int max(int a,int b)
{
   if(a>=b)
       return a;
   else return b;
}
 
int foolish(int n,int w[],int v[],int x[],int C)
{
    int i,j;
    for(i=0;i<=n;i++)
        V[i][0]=0;
    for(j=0;j<=C;j++)
        V[0][j]=0;
	printf("序号 质量 价值  \n",i,w[i-1],v[i-1]);
    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++){
				if(x[i]==1){
					printf("第%d个被选择\n",i);
				}
				else{
					printf("第%d个不被选择\n",i);
				}
			}   
            
        return V[n][C];
        
}
 
void main()
{
    int s;
    int w[100];
    int v[100];
    int x[100];
    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++){
		printf("\n请输入第%d个物品重量: ",i+1);
        scanf("%d",&w[i]);
	}
    printf("\n请分别输入物品的价值:\n");
    for(i=0;i<n;i++){
        printf("\n请输入第%d个物品价值: ",i+1);
		scanf("%d",&v[i]);
    }
    s=foolish(n,w,v,x,C);
    printf("此时最大物品价值为:\n");
    printf("%d\n",s);
   }

实验结果:
在这里插入图片描述
emmm蛮力有时候很好解决问题,但是这一定是你时间急的情况下,否则其实可以选择更好的方法进行解决。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值