30/09/2018, 18:38

Tìm các số A, B, C thỏa : A + B + C = N

Viết chương trình giao diện cho phép nhập số nguyên dương N, xuất ra màn hình giao diện các giá trị bộ giá trị A,B,C thoả các điều kiện sau:
• >0 và <N

• A + B + C = N

Ví dụ

• N= 3, output là

1 + 1 + 1 = 3

Found: 1

• N= 4, output:

1 + 1 + 2 = 4

1 + 2 + 1 = 4

2 + 1 + 1 = 4

Found: 3

• N=2, ouput: Found: 0

Mong mọi người giúp mình tìm thuật toán. Mình xin cảm ơn rất nhiều

Nguyen Ca viết 20:47 ngày 30/09/2018

Cho 3 vòng for lồng nhau là được. với n không quá lớn.

Cương Nguyễn viết 20:39 ngày 30/09/2018

2 vòng for thôi
for i=1 -> n-2
for j = i -> n-i-1 {
k = n - i - j;
if (k >= j) -> i, j, k chinh la nghiem cua phuong trinh.
}

Interns viết 20:49 ngày 30/09/2018

Mình có ý tưởng thế này

#include <stdio.h>
int main()
{
    int n, k;
    printf("Nhap n: ");
    scanf("%d", &n);
    if(n<3)
        printf("Khong thoa dieu kien!\n");
    else
    {
        for(int i=1; i<n; i++)
            for(int j=1; j<n; j++)
                if((k = n-i-j)>0)
                    printf("%d + %d + %d = %d\n", i, j, k, n);
    }
}
Cương Nguyễn viết 20:49 ngày 30/09/2018

Cách của bác vẫn chưa loại được nghiệm trùng nhau

Cương Nguyễn viết 20:38 ngày 30/09/2018

• N= 4, output:
1 + 1 + 2 = 4
1 + 2 + 1 = 4
2 + 1 + 1 = 4

1 1 2 với 2 1 1 vẫn tính khác nhau à :v

Toan Nguyen viết 20:52 ngày 30/09/2018

Bạn tự tưởng tượng ra bạn có n quả bóng.
Bạn đặt n quả bóng bạn có thành 1 hàng. Tiếp theo, giữa mỗi cặp của quả bóng liền kề, tự nhiên có 1 hàng rao từ trên trời rơi xuống hoặc không có gì cả.

Ví dụ: Bạn có 3 quả bóng, có khả năng bóng của bạn sẽ trông giống như thế này.

O|O|O    (111)
OO|O     (21)
O|OO     (12)
OOO      (3)

Hiển nhiên rằng, có 1 thoả thuận ngầm giữa cách sắp xếp bóng/hàng rào với các cặp số (combination numbers, *** éo biết tiếng việt của từ này) có tổng là n.

Từ đó, bạn có thể thấy rằng sẽ luôn có n - 1 hàng rào mà chúa trời ban cho bạn, cũng như có 2^(n-1) lần chúa trời ném hàng rào từ trên trời xuống hoặc không ném gì cả.

Do đó, thuật toán cho vấn đề này là: f(n) = 2^(n-1)

Chúc bạn may mắn!

PS: Tham khảo thêm http://mathworld.wolfram.com/Partition.html

Tuan Tran Duong viết 20:54 ngày 30/09/2018

Mình nhớ mang máng là bài toán quy hoạch động hình như có trong GT Lê Minh Hoàng ấy bạn xem thử.

Liêu Đức Mạnh viết 20:49 ngày 30/09/2018

Bài này không phải quy hoạch động đâu bạn. Bài này 3 vòng for lồng nhau là được rồi mà. Phía dưới là code của mình, có thể không tối ưu. Bạn có thể tham khảo

#include <iostream>

using namespace std;

int main()
{
    int n;
    cout << "nhap n: ";
    int dem=0;
    cin >> n;
    for(int i=1;i<n;i++)
        for(int j=1;j<n;j++)
            for(int k=1;k<n;k++)
                if(i+j+k==n){
                    cout << i << " + " << j << " + " << k << " = " << n << endl;
                    dem++;
                }
    cout << "Found: " << dem << endl;
    return 0;
}
Gió viết 20:52 ngày 30/09/2018

Số lượng bộ 3 thõa mãn là: C2n-1
###Chứng minh:

đặt x=a-1,y=b-1,c=z-1; biểu thức tương đương x+y+z=n-3
bài Toán quy về tìm bộ ba số tự nhiên có tổng = n-3. Có liên quan đến bài toán tổ hợp: số cách xếp n viên bi vào k hộp khác nhau là một bài toán tổ hợp lặp thường gặp:có kq = Ck-1n+k-1
Thay vào n=n-3,k=3 được công thức trên

Trần Tuấn An viết 20:54 ngày 30/09/2018

#include<conio.h>
#include<stdio.h>
int main()
{ int i,j,k;
int n;

	do{
	
	printf("Nhap vao gia tri cua n:");
	scanf("%d",&n);}while(n<3);
	for(i=1;i<n;i++)
	{
		for(j=1;j<n;j++)
		{
		k=n-i-j;
		if(k>0)
		{
			printf("Bo ba so do la %d-%d-%d\n",i,j,k);
		}
		}
	}
}

Theo output thi bo 3 so ko cần khác nhau phải ko vậy

Hoàng Việt viết 20:38 ngày 30/09/2018

Cảm ơn mọi người nhiều ! Mình đã hiểu được vấn đề rồi !

Bài liên quan
0