- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
先看题目
物品不能分隔,必须全部取走或者留下,因此称为01背包
(只有不取和取两种状态)
看第一个样例
我们需要把4个物品装入一个容量为10的背包
我们可以简化问题,从小到大入手分析
weight value 2 1 3 3 4 5 7 9
先考虑物品数量为1的情况:
把前1件物品放入容量为1的背包,此时得到的最大价值是:0
把前1件物品放入容量为2的背包,此时得到的最大价值是:1
把前1件物品放入容量为3的背包,此时得到的最大价值是:1
......
把前1件物品放入容量为10的背包,此时得到的最大价值是:1
把前2件物品放入容量为1的背包,此时得到的最大价值是:0
把前2件物品放入容量为2的背包,此时得到的最大价值是:1
把前2件物品放入容量为3的背包,此时得到的最大价值是:3
把前2件物品放入容量为4的背包,此时得到的最大价值是:3
把前2件物品放入容量为5的背包,此时得到的最大价值是:4
把前2件物品放入容量为6的背包,此时得到的最大价值是:4
......
把前2件物品放入容量为10的背包,此时得到的最大价值是:4
把前3件物品放入容量为1的背包,此时得到的最大价值是:0
把前3件物品放入容量为2的背包,此时得到的最大价值是:1
把前3件物品放入容量为3的背包,此时得到的最大价值是:3
把前3件物品放入容量为4的背包,此时得到的最大价值是:5
把前3件物品放入容量为5的背包,此时得到的最大价值是:5
把前3件物品放入容量为6的背包,此时得到的最大价值是:6
......
把前3件物品放入容量为10的背包,此时得到的最大价值是:9
即:先从物品的数量开始枚举,对i件物品枚举所对应的背包容量j,考虑它的最大价值f[i][j]
for(int i=1;i<=n;i++){//总共有n件物品 for(int j=1;j<=m;j++){//背包的最大容量是m } }
对于一个f[i][j]:
(1)假设我们不选择第i件物品,则f[i][j] = f[i-1][j]
,相当于把前i-1件物品放入这个容量为j的背包,得到的最大值;
(2)假设我们选择第i件物品,则这个物品剩余的空间就是j-w[i]
,前一次循环的时候必定会算出这个值来,因此可以让:f[i][j] = f[i-1][j-w[i]] + v[i]
两种选择中,我们保留最优解,避免下标出现负数(即j-w[i]
可能为负数)
for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ f[i][j]=f[i-1][j]; if(j>=w[i])f[i][j]=max(f[i][j],f[i-1][j-w[i]]+v[i]); } } printf("%d\n",f[n][m]);
其实这道题还有更多的做法,例如递归,从大到小的做法
上面的做法其实是递推,时间复杂度是O(nm),相比递归好一点,使用这种算法只要保证nm在107以内即可。空间复杂度则是O(n*m)
其实上,f数组是可以压缩成一维数组的
对于一个数f[i][j],实际上是只用到了第i-1行
因此,经过简单的优化,只需要一行即可,把上一行的信息移动下来,删掉所有相关第一维度的东西,看看会变成什么样:
f[j]=f[j-w[i]]; //直接存到下一行中 f[j]=f[j]; f[j]=max(f[j],f[j-w[i]]);
对于一维数组的问题所在:循环的顺序会发生变化,如果继续按照从左到右的顺序进行循环的话,我们会发现,每一个数字都会被后面的数据所引用,因此需要从后往前来递推。这样,后面的值更新的时候不会被第二次使用,更新前面的值都不会被影响到。
反正记住是从后往前就行了
完整版的代码
for(int i=1;i<=n;i++){ for(int j=m;j>=w[i];j--){ //此处写j>=w[i]避免下标产生负数 //相当于if(j>=w[i]) f[j]=max(f[j],f[j-w[i]]+v[i]); f[j]=max(f[j],f[j-w[i]]+v[i]); } }
Giới hạn dòng điện cửa sổ trượt Giới hạn dòng điện cửa sổ trượt là một thuật toán giới hạn dòng điện thường được sử dụng để duy trì một cửa sổ có kích thước cố định và cho phép số lượng yêu cầu đi qua trong một đơn vị thời gian không vượt quá ngưỡng đã đặt. Cụ thể, thuật toán giới hạn dòng cửa sổ trượt thường bao gồm các bước sau: Khởi tạo: Thiết lập cửa sổ
Đánh giá biểu thức: một biểu thức chỉ có +, -, *, /, không có dấu ngoặc Một cách tiếp cận kỳ diệu: sử dụng một mảng để lưu trữ số và toán tử, tính toán phép nhân và phép chia với mức độ ưu tiên cao trước, sau đó tính toán phép cộng và phép trừ int GetVal(string s){
[Thuật toán] Bài toán tổng tiền tố Trước tiên, chúng ta hãy xem xét một bài toán: (Bài toán mẫu tổng tiền tố) Với một mảng A[], chúng ta muốn tìm tổng của một số số trong mảng đó. Định dạng đầu vào: Đầu tiên, có các số nguyên N, M, nghĩa là có tổng cộng N số và có M nhóm truy vấn. Tiếp theo, có N số, nghĩa là A[1].
1. Duyệt theo thứ tự gốc-trái-phải, bạn có thể sử dụng đệ quy void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
Trước tiên, chúng ta hãy xem xét câu hỏi. Các vật phẩm không thể tách rời. Tất cả chúng phải được mang đi hoặc để lại. Do đó, nó được gọi là ba lô 01 (chỉ có hai trạng thái: không lấy và lấy). Chúng ta hãy xem xét ví dụ đầu tiên. Chúng ta cần đặt 4 vật phẩm vào một ba lô có sức chứa 10. Chúng ta có thể đơn giản hóa vấn đề và phân tích trọng số từ nhỏ đến lớn.
Tôi đã gặp câu hỏi này trong một cuộc phỏng vấn gần đây: Cho ma trận sau: [[RRRRRR], [RBBBRR], [BRRRBB], [RBRRRR]] Tìm xem có
Tôi đang cố gắng gửi email thông qua thuật toán C++ từ tài khoản Outlook của mình, tài khoản này đã được mở và đăng nhập, nhưng không biết phải bắt đầu từ đâu (để tích hợp Outlook-C++) và Google cũng không giúp được tôi nhiều. Bất kỳ lời khuyên nào cũng sẽ được trân trọng.
Tôi thấy mình đang viết một vòng lặp while thủ công như thế này: std::list foo; // Trong trường hợp của tôi, map, nhưng list thì đơn giản hơn auto currentPoin
Tôi có mã opencv để phát hiện hình vuông. Bây giờ tôi muốn sau khi phát hiện hình vuông, mã sẽ chạy một lệnh khác. Mã như sau: #include "cv.h" #include "cxcore.h" #include "high
Tôi đang cố gắng mô phỏng hàm "imfill" của matlab để điền vào ảnh nhị phân (ma trận 2 chiều gồm 1 và 0). Tôi muốn chỉ định một điểm bắt đầu trong ma trận và thực hiện đổ đầy như phiên bản 4 kết nối của imfill. Cái này đã tồn tại chưa?
Tôi đang đọc cuốn "Thuật toán C++" của Robert Sedgewick. Phần về sự lặp lại cơ bản đã được đề cập đến như Loại sự lặp lại này xảy ra khi một vòng lặp được nhập vào để loại bỏ sự lặp lại của một mục
Tôi đang suy nghĩ về cách tạo cấu trúc dữ liệu thể hiện các nhiệm vụ trong lịch của tôi (chỉ phục vụ mục đích sử dụng cá nhân). Tôi có các bản ghi nhiệm vụ được sắp xếp theo ngày từ một DBMS, như thế này: Mua sữa (18.1.2013) Ngày nhiệm vụ (2013-01-15) Thẻ nhiệm vụ (
Nhập một mảng số nguyên chưa được sắp xếp A[1..n] chỉ bằng O(d) : (d int) đếm số lần mỗi phần tử xuất hiện trong danh sách trong một lần lặp duy nhất. bản đồ là một cây tìm kiếm nhị phân cân bằng dựa trên việc đảm bảo O(nl
Tôi gặp phải một vấn đề mà vẫn chưa biết cách giải quyết. Tôi đã tìm ra cách thực hiện theo phương pháp thô bạo, nhưng nó không hiệu quả khi có hàng chục nghìn phần tử. Vấn đề: Giả sử bạn được đưa ra những điều sau
Tôi có một danh sách các danh sách. L1 = [[...][...][.......].......] Nếu tôi lấy tất cả các phần tử sau khi làm phẳng danh sách và trích xuất các giá trị duy nhất từ chúng, thì tôi sẽ nhận được danh sách L2. Tôi có một danh sách L3 khác là một danh sách nhất định của L2
Chúng ta được cho một mảng ma trận 2D (giả sử chiều dài i và chiều rộng j) và số nguyên k, chúng ta phải tìm kích thước của hình chữ nhật nhỏ nhất chứa tổng này hoặc lớn hơn Fe k=7 4 1 1 1 1 1 4 4 Đáp án là 2, vì 4+4=8 >= 7,
Tôi thực hành hệ thống đảo ngược 3 phạm trù, chuyển đổi phạm trù mỗi tuần. Thứ tự là lớp sáng (m), lớp tối (n) và lớp chiều (a). Thứ tự cố định của tôi, tức là không bao giờ thay đổi, ngay cả khi tôi không làm việc trong tuần đó. Tôi đã tạo một hàm để lấy số tuần theo tiêu chuẩn ISO. Khi tôi cho nó một ngày
Giả sử chúng ta có một đầu vào là một danh sách các phần tử: {a, b, c, d, e, f} Ngoài ra còn có các tập hợp khác nhau có thể chứa bất kỳ tổ hợp nào của các phần tử này và cũng có thể chứa các phần tử khác không có trong danh sách đầu vào: A:{e,f} B:{d,f,a} C:
Tôi có một thuật toán tập hợp con tìm tất cả các tập hợp con của một tập hợp nhất định. Vấn đề với bộ sưu tập gốc là nó là một bộ sưu tập liên tục phát triển và nếu tôi thêm các phần tử vào đó, tôi cần phải tính toán lại các tập hợp con của nó một lần nữa. Có cách nào để tối ưu hóa thuật toán tập hợp con có thể tính toán lại từ điểm tính toán cuối cùng không?
Tôi có một bảng gồm 1 triệu ký hiệu và tần suất dự kiến của chúng. Tôi muốn nén các chuỗi ký hiệu này bằng cách gán cho mỗi ký hiệu một chuỗi bit có độ dài thay đổi duy nhất (và có tiền tố duy nhất), sau đó nối chúng lại với nhau để biểu diễn chuỗi. Tôi muốn gán các chuỗi bit này để trình tự mã hóa
Tôi là một lập trình viên xuất sắc, rất giỏi!