天天看点

c 01背包 vs2022 源代码

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main() {

//1.键盘录入一个常量,用来表示  物品的种类,  n = 5;
//2.键盘录入一个常量,用来表示  背包的容量,  c = 10;
//3.创建一个整型数组,用来收纳 每个物品的重量,int weight[]; 数据:  1 4 2 5 2
//4.创建一个整型数组,用来收纳 每个物品的价值, int value[]; 数据:  1 6 5 3 1
//5.创建一个函数,用来表示01背包的进行的过程。
int zero(int n, int c, int weight[], int value[]);//声明函数

//1.键盘录入一个常量,用来表示  物品的种类,  n = 5;

printf("请输入物品的种类:");
int n=0;
scanf_s("%d", &n);

//2.键盘录入一个常量,用来表示  背包的容量,  c = 10;

printf("请输入物品的容量:");
int c=0;
scanf_s("%d", &c);

//3.创建一个整型数组,用来收纳 每个物品的重量,int weight[];

printf("请输入每个物品的重量:");
int weight[5] = { 0 };

int sz = sizeof(weight)/sizeof(weight[0]);
for (int i = 0; i < sz; i++) 
{
  scanf_s("%d", &weight[i]);
}


//4.创建一个整型数组,用来收纳 每个物品的价值, int value[];
printf("请输入每个物品的价值:");
int value[5] = { 0 };

int sz1 = sizeof(value) / sizeof(value[0]);
for (int i = 0; i < sz1; i++)
{
   scanf_s("%d", &value[i]);
}



int sb = zero(5, 10, weight, value);
 printf("%d", sb);

return 0;      

}

​​//5.创建一个函数​​,用来表示01背包的进行的过程。

int zero(int n, int c, int weight[], int value[])

{

int dp[6][11] = { 0 }; //数组使用时都要进行初始化。要不然容易报错。

int Max(int a,int b);//声明函数

for (int i = 1; i <=n; i++) 
{
  int w1 = weight[i - 1];
  int v = value[i - 1];

  for (int j = 1; j <= c; j++) 
  {
    if (j < w1) 
    {
      dp[i][j] = dp[i - 1][j];
      continue;
    }
    else 
    {
      dp[i][j] = Max(dp[i - 1][j], dp[i - 1][j - w1] + v);
    }
  }
}

return dp[n][c];      

}

int Max(int a, int b)

{

if(a>=b)
{
  return a;
}
else
{
  return b;
}      

}

/二维数组使用时都要进行初始化。要不然容易报错。