题目链接:http://acm.fafu.edu.cn/problem.php?id=1072
组合的话由于数小于等于10,可以用穷举法,不过没有算法味道
#include <stdio.h>
#include <string.h>
int main(void)
{
int i, n, k, m, sum = 0;
int a[10];
int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10;
scanf("%d%d", &n, &k);
for(i = 0;i < n; ++i)
{
scanf("%d", &a[i]);
}
switch (k)
{
case 1:
for(i1 = 0; i1 < n; ++i1)
{
sum += a[i1];
}
break;
case 2:
for(i1 = 0; i1 < n - 1; ++i1)
{
for(i2 = i1 + 1; i2 < n; ++i2)
{
sum += a[i1]*a[i2];
}
}
break;
case 3:
for(i1 = 0; i1 < n - 2; ++i1)
{
for(i2 = i1 + 1; i2 < n - 1; ++i2)
{
for(i3 = i2 + 1; i3 < n; ++i3)
{
sum += a[i1]*a[i2]*a[i3];
}
}
}
break;
case 4:
for(i1 = 0; i1 < n - 3; ++i1)
{
for(i2 = i1 + 1; i2 < n - 2; ++i2)
{
for(i3 = i2 + 1; i3 < n - 1; ++i3)
{
for(i4 = i3 + 1; i4 < n; ++i4)
{
sum += a[i1]*a[i2]*a[i3]*a[i4];
}
}
}
}
break;
case 5:
for(i1 = 0; i1 < n - 4; ++i1)
{
for(i2 = i1 + 1; i2 < n - 3; ++i2)
{
for(i3 = i2 + 1; i3 < n - 2; ++i3)
{
for(i4 = i3 + 1; i4 < n - 1; ++i4)
{
for(i5 = i4 + 1; i5 < n; ++i5)
{
sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5];
}
}
}
}
}
break;
case 6:
for(i1 = 0; i1 < n - 5; ++i1)
{
for(i2 = i1 + 1; i2 < n - 4; ++i2)
{
for(i3 = i2 + 1; i3 < n - 3; ++i3)
{
for(i4 = i3 + 1; i4 < n - 2; ++i4)
{
for(i5 = i4 + 1; i5 < n - 1; ++i5)
{
for(i6 = i5 + 1; i6 < n; ++i6)
{
sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6];
}
}
}
}
}
}
break;
case 7:
for(i1 = 0; i1 < n - 6; ++i1)
{
for(i2 = i1 + 1; i2 < n - 5; ++i2)
{
for(i3 = i2 + 1; i3 < n - 4; ++i3)
{
for(i4 = i3 + 1; i4 < n - 3; ++i4)
{
for(i5 = i4 + 1; i5 < n - 2; ++i5)
{
for(i6 = i5 + 1; i6 < n - 1; ++i6)
{
for(i7 = i6 + 1; i7 < n; ++i7)
{
sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6]*a[i7];
}
}
}
}
}
}
}
break;
case 8:
for(i1 = 0; i1 < n - 7; ++i1)
{
for(i2 = i1 + 1; i2 < n - 6; ++i2)
{
for(i3 = i2 + 1; i3 < n - 5; ++i3)
{
for(i4 = i3 + 1; i4 < n - 4; ++i4)
{
for(i5 = i4 + 1; i5 < n - 3; ++i5)
{
for(i6 = i5 + 1; i6 < n - 2; ++i6)
{
for(i7 = i6 + 1; i7 < n - 1; ++i7)
{
for(i8 = i7 + 1; i8 < n; ++i8)
{
sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6]*a[i7]*a[i8];
}
}
}
}
}
}
}
}
break;
case 9:
for(i1 = 0; i1 < n - 8; ++i1)
{
for(i2 = i1 + 1; i2 < n - 7; ++i2)
{
for(i3 = i2 + 1; i3 < n - 6; ++i3)
{
for(i4 = i3 + 1; i4 < n - 5; ++i4)
{
for(i5 = i4 + 1; i5 < n - 4; ++i5)
{
for(i6 = i5 + 1; i6 < n - 3; ++i6)
{
for(i7 = i6 + 1; i7 < n - 2; ++i7)
{
for(i8 = i7 + 1; i8 < n - 1; ++i8)
{
for(i9 = i8 + 1; i9 < n; ++i9)
{
sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6]*a[i7]*a[i8]*a[i9];
}
}
}
}
}
}
}
}
}
break;
case 10:
for(i1 = 0; i1 < n - 9; ++i1)
{
for(i2 = i1 + 1; i2 < n - 8; ++i2)
{
for(i3 = i2 + 1; i3 < n - 7; ++i3)
{
for(i4 = i3 + 1; i4 < n - 6; ++i4)
{
for(i5 = i4 + 1; i5 < n - 5; ++i5)
{
for(i6 = i5 + 1; i6 < n - 4; ++i6)
{
for(i7 = i6 + 1; i7 < n - 3; ++i7)
{
for(i8 = i7 + 1; i8 < n - 2; ++i8)
{
for(i9 = i8 + 1; i9 < n - 1; ++i9)
{
for(i10 = i9 + 1; i10 < n - 1; ++i10)
{
sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6]*a[i7]*a[i8]*a[i9]*a[i10];
}
}
}
}
}
}
}
}
}
}
break;
default:
break;
}
printf("%d\n", sum);
return 0;
}
可以用深度优先算法来做,代码简练精短
#include<stdio.h>
int m,n,a[15],ans=0;
void dfs(int x,int k,int j)
{
if(k==m)
{
ans+=j;
return;
}
if(x>n) return;
dfs(x+1,k+1,j*a[x]);
dfs(x+1,k,j);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dfs(1,0,1);
printf("%d\n",ans);
return 0;
}
能写出第一个代码,真的是太佩服我自己了~~~~(>_<)~~~~