1-n,从中选择任意两两不同的k个数,输出所有可能的组合,要求不重不漏

參考:http://blog.youkuaiyun.com/hyq666888/article/details/22572695



	/**
	 * 给定n个数{1,2,3,...,n},从中选择任意两两不同的k个数,输出所有可能的组合
	 * 要求不重不漏
	 * 
	 * 思路:
	 * 假如說n=9 k=5的話。
	 * 那最後一個輸出的數字肯定是 5 6 7 8 9
	 * 而且每一輪輸出的最終數字都在 5 6 7 8 9 中
	 * 例如第一輪輸出的 12345-12349 中的9 就在 5 6 7 8 9 中。
	 * 
	 * 所以我們可以每次輸出后,用當前輸出的數字去與 56789中對應的位置去比較,如果相等的話,就說明此輪輸出完畢
	 * 然後就倒退一位繼續比較。倒退后,如果加1 的話,那後面的幾位也要對應的發生改變 如 12789-》13456 其中 456 3個位置就發生了改變
	 * 
	 * 最後如果第一位等於n-k+1的話,輸出就結束了。
	 * 
	 * 參考:http://blog.youkuaiyun.com/hyq666888/article/details/22572695
	 * */
	private static void fun1(int n, int k) {
		int arr[]=new int[k];
		int index[]=new int[k];
		
		for(int i=0;i<k;i++){
			arr[i]=i+1;
			index[i]=n-k+i+1;
		}
		
		while(true){
			for(int i=0;i<k;i++)
				System.out.print(arr[i]);
			System.out.println();
			
			//循环终止条件
			if(arr[0]==index[0])
				break;

			//输出一次后,对数组调整
			for(int i=k-1;i>=0;i--){
				if(arr[i]<index[i]){//末尾位不够最终数,加 1 。 false代表。第k位数够了,然后加第k-1位数
					arr[i]++;
					
					//假如是在增加第s位数(s最小可为1)时,第s到k位数要发生变化
					for(int j=i+1;j<k;j++)
						arr[j]=arr[j-1]+1;
					
					break;//此次增加結束后就退出循環去輸出結果
				}
			}
		}
	}


题目描述 机器人比赛中,队员的个人能力并非是决定队伍成绩的唯一因素。队员间的协作磨合往往更关键—有时个人能力强的“强强组合”,成绩反而不如能力稍弱但协作好的队伍。现有 n 名候选队员,需从中选出k名组成队伍,需通过计算队伍综合实力,选出综合实力最大的队伍。 已知条件如下: 1. 每名队员i(编号0~n-1)有非负整数的个人能力值a[i: 2. 任意两名队员i和j之间有非负整数的协作系数c[[,且满足c[ibil=cG]i、c[i[i=0(自身无协作关系)。 队伍综合实力的计算规则为: • 综合实力=队伍中所有队员的个人能力总和+队伍中所有不同队员对的协作系数总和。 请你设计算法,计算并输出选出k名队员组成队伍的最大综合实力值。 输入格式 1. 第一行:两个整数n和k,分别表示候选队员总数、需选出的队员数(2≤k≤n≤20); 2. 第二行:n个非负整数,依次表示a[0],a[1],••a[n-1],即每名队员的个人能力值(0≤a[i]≤100); 3. 接下来n 行:每行包含n个非负整数,第i行第j列的数表示c[i][j
(0≤cli][j≤100)。 输出格式 一个整数,表示选出k名队员组成队伍的最大综合实力值。 样例输入 4 2 10 9 8 7 0 3 1 0 3 0 2 4 1 2 0 5 0 4 5 0 样例输出 22 样例解释 候选队员共4人,需选2人组队,所有可能组队的综合实力计算如下: * 队员 0+1:个人能力和=10+9=19,协作系数和=3-综合实力=22; * 队员 0+2:个人能力和 =10+8=18,协作系数和=1 综合实力=19; * 队员 0+3:个人能力和=10+7=17,协作系数和 =0 综合实力=17; * 队员 1+2:个人能力和 = 9+8=17,协作系数和=2 综合实力=19; * 队员 1+3:个人能力和= 9+7=16,协作系数和=4 综合实力= 20; * 队员 2+3:个人能力和 =8+7=15,协作系数和=5 综合实力=20。 其中最大综合实力为 22。 数据范围 * 队员总数:2≤n≤ 20 * 需选队员数:2≤k≤n * 个人能力值:0≤ ali]≤ 100 * 协作系数:0≤ c[i][j] ≤ 100,且c[i]lj] = c[jl[i]、c[i]li] = 0 解读题目,根据题目要意,用c++代码体现出来
10-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值