给定n个项目的权重和值,任务是将这些项目放入容量为W的背包中,以在背包中获得最大的总价值,我们可以重复放置相同的项目,也可以放置项目的分数。
例子:
Input: val[] = {14, 27, 44, 19}, wt[] = {6, 7, 9, 8}, W = 50
Output: 244.444
Input: val[] = {100, 60, 120}, wt[] = {20, 10, 30}, W = 50
Output: 300
做法:这里的想法是只要找到它具有最大的价值与重量比的项目。然后仅用此物品填充整个背包,以使背包的最终价值最大化。
以下是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return the maximum required value
float knapSack(int W, float wt[], float val[], int n)
{
// maxratio will store the maximum value to weight
// ratio we can have for any item and maxindex
// will store the index of that element
float maxratio = INT_MIN;
int maxindex = 0;
// Find the maximum ratio
for (int i = 0; i < n; i++) {
if ((val[i] / wt[i]) > maxratio) {
maxratio = (val[i] / wt[i]);
maxindex = i;
}
}
// The item with the maximum value to
// weight ratio will be put into
// the knapsack repeatedly until full
return (W * maxratio);
}
// Driver code
int main()
{
float val[] = { 14, 27, 44, 19 };
float wt[] = { 6, 7, 9, 8 };
int n = sizeof(val) / sizeof(val[0]);
int W = 50;
cout << knapSack(W, wt, val, n);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Function to return the maximum required value
static float knapSack(int W, float wt[],
float val[], int n)
{
// maxratio will store the maximum value to weight
// ratio we can have for any item and maxindex
// will store the index of that element
float maxratio = Integer.MIN_VALUE;
int maxindex = 0;
// Find the maximum ratio
for (int i = 0; i < n; i++)
{
if ((val[i] / wt[i]) > maxratio)
{
maxratio = (val[i] / wt[i]);
maxindex = i;
}
}
// The item with the maximum value to
// weight ratio will be put into
// the knapsack repeatedly until full
return (W * maxratio);
}
// Driver code
public static void main(String[] args)
{
float val[] = {14, 27, 44, 19};
float wt[] = {6, 7, 9, 8};
int n = val.length;
int W = 50;
System.out.println(knapSack(W, wt, val, n));
}
}
// This code is contributed by 29AjayKumar
Python3
# Python implementation of the approach
import sys
# Function to return the maximum required value
def knapSack(W, wt, val, n):
# maxratio will store the maximum value to weight
# ratio we can have for any item and maxindex
# will store the index of that element
maxratio = -sys.maxsize-1;
maxindex = 0;
# Find the maximum ratio
for i in range(n):
if ((val[i] / wt[i]) > maxratio):
maxratio = (val[i] / wt[i]);
maxindex = i;
# The item with the maximum value to
# weight ratio will be put into
# the knapsack repeatedly until full
return (W * maxratio);
# Driver code
val = [ 14, 27, 44, 19 ];
wt = [ 6, 7, 9, 8 ];
n = len(val);
W = 50;
print(knapSack(W, wt, val, n));
# This code is contributed by Rajput-Ji
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to return the maximum required value
static float knapSack(int W, float []wt,
float []val, int n)
{
// maxratio will store the maximum value to weight
// ratio we can have for any item and maxindex
// will store the index of that element
float maxratio = int.MinValue;
int maxindex = 0;
// Find the maximum ratio
for (int i = 0; i < n; i++)
{
if ((val[i] / wt[i]) > maxratio)
{
maxratio = (val[i] / wt[i]);
maxindex = i;
}
}
// The item with the maximum value to
// weight ratio will be put into
// the knapsack repeatedly until full
return (W * maxratio);
}
// Driver code
public static void Main()
{
float []val = {14, 27, 44, 19};
float []wt = {6, 7, 9, 8};
int n = val.Length;
int W = 50;
Console.WriteLine(knapSack(W, wt, val, n));
}
}
// This code is contributed by AnkitRai01
输出:
244.444