Chào mọi người. Mình có đang giải 1 problem sau: http://ntucoder.net/Problem/Details/4420
Ý tưởng của mình là dùng quay lui sinh dãy nhị phân, quy ước: 0 là của bạn A và 1 là của bạn B.
Độ dài dãy nhị phân được sinh ra là n. Sau khi sinh ra xong, ta sẽ kiểm tra nếu số tiền mà A nhận được = số tiền mà B nhận được thì thêm dãy kết quả vào một vector<string>.
Mình cài đặt thuật toán như sau: https://ideone.com/F3D4PP
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int arr[20], nofs = 0;
void gen(const vector<int> &mvc, vector<string> &res, int n, int i = 0)
{
if (i == n) {
int a, b;
string s;
int sumofa = 0, sumofb = 0;
for(int j = 0; j < n; ++j) {
if (arr[j] == 0) {
s.push_back('A');
sumofa += mvc[i];
}
else {
s.push_back('B');
sumofb += mvc[i];
}
}
if (sumofa == sumofb) {
res.push_back(s);
++nofs;
}
}
else {
arr[i] = 0;
gen(mvc, res, n, i + 1);
arr[i] = 1;
gen(mvc, res, n, i + 1);
}
}
int main()
{
int n;
vector<int> mvc; // store input sequence
vector<string> res; // store result
cin >> n;
mvc.resize(n);
res.resize(n);
for (int i = 0; i < n; ++i) {
res[i].resize(n);
cin >> mvc[i];
}
gen(mvc, res, n);
if (nofs > 0) {
cout << nofs << endl;
for (int i = 0; i < nofs; ++i) {
for (int j = 0; j < n; ++j) {
cout << res[i][j] << " ";
}
cout << endl;
}
}
else cout << "khong chia duoc";
return 0;
}
và chạy thử với input mẫu: 6 1 2 2 5 10 10
thì output sai hoàn toàn. (như stdout ở link IDEone trên)
Mình mò mãi vẫn ko biết lỗi ở chỗ nào, Codeblocks thì đặt break point ở dòng đầu tiên hàm main() thì ko debug được!
Nhờ mọi người giúp đỡ mình xem sai ở chỗ nào và cách sửa, cách cải thiện ra sao ạ !
Xin cảm ơn.




83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?