0-1背包问题 c语言_动态编程在C中的0-1背包问题

0-1背包问题 c语言

Here you will learn about 0-1 knapsack problem in C.

在这里,您将学习C语言中的0-1背包问题。

We are given n items with some weights and corresponding values and a knapsack of capacity W. The items should be placed in the knapsack in such a way that the total value is maximum and total weight should be less than knapsack capacity.

我们给了n个具有一定权重和相应值的项目以及一个容量为W的背包。这些项目应以总值最大且总重量小于背包容量的方式放置在背包中。

In this problem 0-1 means that we can’t put the items in fraction. Either put the complete item or ignore it. Below is the solution for this problem in C using dynamic programming.

在这个问题0-1中,意味着我们不能将项目分成零。 放入完整的项目或忽略它。 下面是使用动态编程在C中解决此问题的方法。

0-1背包问题 c语言_动态编程在C中的0-1背包问题

动态编程的C背包问题程序 (
Program for Knapsack Problem in C Using Dynamic Programming)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
int max(int a, int b) { return (a > b)? a : b; }
int knapSack(int W, int wt[], int val[], int n)
{
   int i, w;
   int K[n+1][W+1];
   for (i = 0; i <= n; i++)
   {
       for (w = 0; w <= W; w++)
       {
           if (i==0 || w==0)
               K[i][w] = 0;
           else if (wt[i-1] <= w)
                 K[i][w] = max(val[i-1] + K[i-1][w-wt[i-1]],  K[i-1][w]);
           else
                 K[i][w] = K[i-1][w];
       }
   }
   return K[n][W];
}
int main()
{
    int i, n, val[20], wt[20], W;
    printf("Enter number of items:");
    scanf("%d", &n);
    printf("Enter value and weight of items:\n");
    for(i = 0;i < n; ++i){
     scanf("%d%d", &val[i], &wt[i]);
    }
    printf("Enter size of knapsack:");
    scanf("%d", &W);
    printf("%d", knapSack(W, wt, val, n));
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
int max ( int a , int b ) { return ( a > b ) ? a : b ; }
int knapSack ( int W , int wt [ ] , int val [ ] , int n )
{
   int i , w ;
   int K [ n + 1 ] [ W + 1 ] ;
   for ( i = 0 ; i <= n ; i ++ )
   {
       for ( w = 0 ; w <= W ; w ++ )
       {
           if ( i == 0 || w == 0 )
               K [ i ] [ w ] = 0 ;
           else if ( wt [ i - 1 ] <= w )
                 K [ i ] [ w ] = max ( val [ i - 1 ] + K [ i - 1 ] [ w - wt [ i - 1 ] ] ,    K [ i - 1 ] [ w ] ) ;
           else
                 K [ i ] [ w ] = K [ i - 1 ] [ w ] ;
       }
   }
   return K [ n ] [ W ] ;
}
int main ( )
{
     int i , n , val [ 20 ] , wt [ 20 ] , W ;
     printf ( "Enter number of items:" ) ;
     scanf ( "%d" , & n ) ;
     printf ( "Enter value and weight of items:\n" ) ;
     for ( i = 0 ; i < n ; ++ i ) {
     scanf ( "%d%d" , & val [ i ] , & wt [ i ] ) ;
     }
     printf ( "Enter size of knapsack:" ) ;
     scanf ( "%d" , & W ) ;
     printf ( "%d" , knapSack ( W , wt , val , n ) ) ;
     return 0 ;
}

Output

输出量

Enter number of items:3 Enter value and weight of items: 100 20 50 10 150 30 Enter size of knapsack:50 250

输入物品数量:3 输入物品的重量和重量: 100 20 50 10 150 30 输入背包尺寸:50 250

You can watch below video to learn knapsack problem easily.

您可以观看下面的视频轻松了解背包问题。

Source: http://www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/

资料来源: http : //www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/

翻译自: https://www.thecrazyprogrammer.com/2016/10/knapsack-problem-c-using-dynamic-programming.html

0-1背包问题 c语言