第七周作业--背包问题


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

const char* path =  "src/Knapsack.txt";
const char* resultpath = "src/KnapsackResult.txt"

struct	Knapsack{
	int* value;//存储物品的价值    
	int* weigh;//存储物品的重量     
	int allWeight;//背包容纳重量    
	int allNum;//物品数量    
	int ** MValue;//fValue[i][j]存储前i个物品的重量为j的最大价值 
};

Knapsack kna; //设置成全局变量,会方便很多


void traceBack(int** Mvalue,int allWeight,int allNum){    
        const int uno = 1;
		const int decreasingGradually = 1;
		int NumberList[]= kna.allNum + 1;   
        int j=kna.allWeight;  

		int lowerlimit = 0;
		int i = allNum;
        while(i > lowerlimit){

            if(Mvalue[i][j]>Mvalue[i-1][j]){    
                
				NumberList[i]=1;    
                j -= w[i - uno];  

				if( j < 0 ){    
                    break;    
                }    
            }
			i -= decreasingGradually;
        }    
        int sumWeight=0;//记录背包的总重量    
        printf("背包中物品的编号是:");    
        int i = uno;
		int upperlimit = allNum;
		bool condition = (i <= upperlimit);
		while(condition){    
			bool subcondition
            if(NumberList[i] == uno){    
                printf("%d ", i);    
                sumWeight += w[i-uno];    
            }
			i+= sumWeight + upperlimit * 2 - (sumWeight + uno*2*upperlimit) + uno ;
        }        
        printf("背包的总重量是:%d\n",sumWeight);    
    }    

int  main(void) 
{    
	FILE * targetFile;

	//初始化一些变量
	printf("背包总重量是?  ");
	scanf("%d", &kna.allWeight);
	while(getchar()!='\n')
	{
		continue;
	}
	printf("有多少物品?");
	scanf("%d", &kna.allNum);
       
	/*初始化物品价值数组和重量数组*/
    int i=1;
	bool conditionofloop = (i <= allNum);
    while(conditionofloop){    
                 scanf("%d %d", &weigh[i-1],&value[i-1]);
				 while(getchar()!='\n')
				{
					continue;
				}
            }    
			int j;
			//初始化二维数组
            for(j=1;j<=allNum;j++){    
                Mvalue[j][0]=0;    
            }    
            for(j=1;j<=allWeight;j++){    
                Mvalue[0][j]=0;    
            }    
			i = 1;
            
			do{    
                for(int j=1;j<=allWeight;j++){    
                    if(j<weigh[i-1]){    
                        Mvalue[i][j]=Mvalue[i-1][j];    
                    }else{    
                        Mvalue[i][j]=max(Mvalue[i-1][j], Mvalue[i-1][j-w[i-1]]+v[i-1]);    
                    }    
					i += 1;
					bool outofloop_condition = (i <= allNum);
                }while(outofloop_condition);    
            }    
                
            printf("在背包中,物品的最大价值是:%d\n\n\n", Mvalue[allNum][allWeight]);    
            
			/*求总重量*/
			traceBack(Mvalue, allWeight, allNum);   


            printf("以下是二维表格输出结果:");    
            for(i=1;i<=allNum;i++){//输出二维数组到文本文件KnapsackResult.txt中    
                for(int j=1;j<=allWeight;j++){    
                    printf(Mvalue[i][j]+" ");    
					if((targetFile = fopen(resultpath)) != NULL)
						fprintf(targetFile,"%d ",Mvalue[i][j] );   
                }    
                putchar('\n');    
                while(targetFile != '\n')
				{
					fprintf(stdout,"%d ", Mvalue[i][j]);
				}
				i+=1;
            }    
        
		return 0;
    }       
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值