Given an infinite positive integer array or say a stream of positive integers, find out the first five numbers whose sum is twenty.
0-1 Knapsack trên mảng số nguyên vô hạn?
Bằng cách đọc báo cáo vấn đề, đầu tiên nó có vẻ là 0-1 Knapsack
vấn đề, nhưng tôi bối rối có thể 0-1 Knapsack algo
được sử dụng trên một dòng số nguyên. Giả sử tôi viết một chương trình đệ quy cho vấn đề trên.
int knapsack(int sum, int count, int idx)
{
if (sum == 0 && count == 0)
return 1;
if ((sum == 0 && count != 0) || (sum != 0 && count == 0))
return 0;
if (arr[idx] > 20) //element cann't be included.
return knapsack(sum, count idx + 1);
return max(knapsack(sum, count, idx +1), knapsack(sum - arr[idx], count -1, idx + 1));
}
Bây giờ khi các chức năng trên sẽ kêu gọi một mảng vô hạn, cuộc gọi đầu tiên trong max
chức năng ví dụ knapsack(sum, count, idx +1)
sẽ không bao giờ trở lại như nó sẽ tiếp tục phớt lờ các yếu tố hiện tại. Ngay cả khi chúng ta thay đổi thứ tự của cuộc gọi trong hàm max
, vẫn có khả năng cuộc gọi đầu tiên sẽ không bao giờ trở lại. Có cách nào để áp dụng knapsack
algo trong các tình huống như vậy không?
Bạn đang tìm kiếm trong năm * số * liên tiếp đầu tiên có tổng là 20? – Davidann
Đây là khó khăn hơn so với vấn đề ba lô. Chúng ta có một ràng buộc bổ sung: chúng ta phải tìm ra sự kết hợp sớm nhất của các số có tổng là hai mươi. Nói cách khác, chúng ta phải xem xét nhiều knapsacks: 5 yếu tố đầu tiên, sau đó là 6 đầu tiên, sau đó là 7 đầu tiên, v.v. – cheeken
@David: không ... không có điều kiện như vậy ... –