中兴2010面试题: 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来. 利用背包思想 /* 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来. */ #include <iostream> using namespace std; typedef int BYTE; int length = 0; int num = 0; void PrintBag(BYTE bag[]) { for(int i=1;i<=length;i++) { if(bag[i] == 1) cout<< i << " "; } cout<<endl; } void BagProblem(int m,int n,BYTE bag[]) { if(n<1) return ; if(n<m) { for(int i = n;i>0;i--) { bag[i] = 1; BagProblem(m-i,i-1,bag); bag[i] = 0; } } else if(m == n) { bag[n] = 1; PrintBag(bag); bag[n] = 0; BagProblem(m,n-1,bag); } else { BagProblem(m,m,bag); } } void bag(int m,int n) { if(n > m) { n = m; } BYTE *bag = new BYTE[n+1]; memset(bag,0,n+1); length = n; BagProblem(m,n,bag); //delete bag; } int main() { int m,n; cin>>n; cin>>m; bag(m,n); return 1; }