用两个循环实现组合
来自:richardhuang 对 ACM World Finals 1999-- "Trade on Verweggistan" 的解决
acm world finals 1999解题报告
#include <stdio.h>
#include <iostream.h>
#include <string.h>
main()
{
int u,n,i,j,k,max,s,total,t,all;
int a[60][30];
int b[2000],c[2000];
int e[300];
scanf("%d",&n);
u=0;
while (n>0)
{
u++;
total=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
b[0]=1;
all=0;
for (i=1;i<=n;i++)
{
scanf("%d",&a[i][0]);
all+=a[i][0];
for (j=1;j<=a[i][0];j++)
{
scanf("%d",&a[i][j]);
}
}/* 读入数据 */
for (i=1;i<=n;i++)
{
memset(c,0,sizeof(c));
s=0;
max=0;
for (j=1;j<=a[i][0];j++)
{
s=s+10-a[i][j];
if (s>max) max=s;
}
s=0;
memset(e,0,sizeof(e));
if (max==0) e[0]=1;
for (j=1;j<=a[i][0];j++)//箱子数
{
s=s+10-a[i][j];
if (s==max) e[j]=1;
}
total+=max;
for (j=0;j<=a[i][0];j++)//把每一堆箱子看作一个数组,取第几个箱子把第几个设为1
for (k=0;k<=all;k++)//all是所有的箱子数,把所有箱子也看作数组,从1到all(解空间)
{
if (b[k]==1 && e[j]==1)
{
c[k+j]=1;//k+j是箱子数的和
}
}
for (k=0;k<=all;k++)
b[k]=c[k];
}/*递推求解*/
printf("Workyards %d\n",u);
printf("Maximum profit is %d.\n",total);
printf("Number of pruls to buy:");
t=0;
for (k=0;k<=all;k++)
if (b[k]==1)
{
t++;
printf(" %d",k);
if (t>=10) break;
}
/*输出解答*/
printf("\n\n");
scanf("%d",&n);
}
}
///////////////////////////////////////////////////////////////////////
功能:把矩阵每一行的数列出所有组合相加的值,不能出现重复,并从小到大输出
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
int m[5][5]={3,4,7,3,8,\
5,6,3,8,4,\
2,9,5,3,4,\
6,7,8,4,2,\
2,9,3,4,2};
int a[100];
int b[100];
int c[10];
void Init()
{
//对a b c初始化
memset(a,0,sizeof(a));//记录正在进行的堆的情况--临时
memset(b,0,sizeof(b));//记录本次以前堆的情况
memset(c,0,sizeof(c));//记录本次的堆的情况
b[0]=1;
}
void main()
{
Init();
for(int i=0;i<5;i++)
{
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
//把本次运算的数组搞定
for(int j=0;j<5;j++)
c[m[i][j]]=1;
//
for(int ii=0;ii<10;ii++)
for(int jj=0;jj<=100;jj++)
{
if(b[jj]==1&&c[ii]==1)
a[ii+jj]=1;
}
for(int kk=0;kk<100;kk++)
b[kk]=a[kk];
}
int num=0;
for(int k=0;k<100;k++)
{
if(b[k]==1)
{
cout<<"第"<<num++<<"个数"<<"\t"<<k<<endl;
}
}
}
评论
发表评论