Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Mời anh em vào thưởng thức!

  1. #1
    Ngày gia nhập
    12 2006
    Bài viết
    72

    Mặc định Mời anh em vào thưởng thức!

    Đề bài: Đầu vào là một số A xác định (chỉ tính số nguyên) và một mảng số nguyên a[] gồm có n phần tử mang giá trị khác nhau, với điều kiện là các phần tử trong mảng a phải nhỏ hơn A.
    Yêu cầu: Hãy viết hàm phân tích A=x1*a[0]+x2*a[1]+x3*a[2]....+xn*a[n-1], với x1,x2,...xn cũng là các số nguyên
    Giá trị trả ra: số trường hợp có thể phân tích được như trên, nếu có thể thì hãy liệt kê tất cả các giá trị nhận được của x1,x2,..xn tương ứng với mỗi trường hợp.

  2. #2
    Ngày gia nhập
    11 2007
    Bài viết
    47

    Trích dẫn Nguyên bản được gửi bởi thangtran Xem bài viết
    Đề bài: Đầu vào là một số A xác định (chỉ tính số nguyên) và một mảng số nguyên a[] gồm có n phần tử mang giá trị khác nhau, với điều kiện là các phần tử trong mảng a phải nhỏ hơn A.
    Yêu cầu: Hãy viết hàm phân tích A=x1*a[0]+x2*a[1]+x3*a[2]....+xn*a[n-1], với x1,x2,...xn cũng là các số nguyên
    Giá trị trả ra: số trường hợp có thể phân tích được như trên, nếu có thể thì hãy liệt kê tất cả các giá trị nhận được của x1,x2,..xn tương ứng với mỗi trường hợp.
    Đây là 1 đáp án:

    Code:
    #include <iostream>
    
    using namespace std;
    
    long int kq, *a, *maxa, *x, tong = 0, sl = 0; 
    int n;
    //========================================================
    void inkq(){
    	sl ++;
    	cout << kq << " = " << x[0] << "*" << a[0];
    	for (int i=1; i<n; i++)
    		cout << " + " << x[i] << "*" << a[i];
    	cout << endl;
    }
    //========================================================
    void get(int i){
    	int j;
    	
    	if (i < n) {
    		for (j=0; j<=maxa[i]; j++){
    			x[i] = j;
    			tong = tong + a[i] * x[i];
    			if (tong < kq) get(i+1);
    			else if (tong == kq) inkq();
    			else j = maxa[i] + 1;
    			tong = tong - a[i] * x[i];
    			x[i] = 0;
    		}
    	}
    }
    //========================================================
    void sort(){
    	for (int i=0; i<n; i++)
    		for (int j=i+1; j<n; j++)
    			if (a[i] < a[j]){
    				long int tg = a[i];
    				a[i] = a[j];
    				a[j] = tg;
    			}
    }
    //========================================================
    main(){
    	cout << "Nhap so can phan tich: ";
    	cin >> kq;
    	cout << "Nhap so luong cac phan tu cua ma tran: " ;
    	cin >> n;
    	a = new long int [n];
    	maxa = new long int [n];
    	x = new long int [n];
    	
    	for (int i=0; i<n; i++){
    		cout << "Nhap phan tu thu " << (i+1) << " : ";
    		cin >> a[i];
    		x[i] = 0;
    	}
    	sort();
    	for (int i=0; i<n; i++) maxa[i] = kq/a[i];
    		
    	get(0);
    	cout <<  endl << "Co " << sl << " cach chon";
    		
    	delete []a;
    	delete []maxa;
    	delete []x;
    	cin.ignore(2);
    }

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Bài này cũng có thể dùng QHD với ý tưởng như sau:
    - Gọi F[i] là số cách để có được tổng A ta có :
    + F[0] = 0;
    + F[i] = F[i] + F[A-a[j-1]*t]
    Nên thủ tục quy hoạch cũng cực kì đơn giản hì hì ^^!
    PHP Code:
    void DynamicProgramming()
    {
        for (
    int num 0num <= nElement-1num++){
            for (
    int value aNumbervalue >= 1value--){
                for(
    int xN 1xN <= aNumberxN++){  
                    if (
    value xN*aSeries[num] >= 0){
                        
    F[value] = F[value] + F[valuexN*aSeries[num]];
                    }
                }
            }
        }


Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn