如何安排相片,使相片尽量能放入几个给定的箱子里(体积不同),但是条件是,每个箱子里的照片不能相邻:如第一张,第二张不能同时放到一个箱子里,而且第一张与最后一张也不能在一起!!!错了N久,解决方法就是尽量把不能最后放的箱子在前面用掉
1.按每个箱子剩余容积排序
放入第一张到一个箱子里
2.每放入一张照片前,先拿第一张所放入的箱子号去放(为了使第一张与最后一张不能相邻),如不行则再按每个箱子剩余容积排序,选择符合的箱子去放

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct data
{
int v;
int no;
int top;
}qun[49];
int ji[49];
int q[1009];
int cmp(data a,data b)
{
if(a.v==b.v)
return a.no<b.no;
return a.v>b.v;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int i,j;
for(i=0;i<m;i++)
{
scanf("%d",&qun[i].v);
qun[i].no=i;
qun[i].top=-1;
}
int add=0;
sort(&qun[0],&qun[m],cmp);
qun[0].v--;
qun[0].top=0;
q[add]=qun[0].no;
add++;
bool xia=0;
for(i=1;i<n;i++)
{
bool su=0;
sort(&qun[0],&qun[m],cmp);
if(i+1!=n)//不是最后一个的情况下,先把与第一个号码一样的送出去,防止首位相邻
for(j=0;j<m;j++)
{
if(qun[j].no==q[0])
{
if((i-qun[j].top)!=1&&qun[j].v>=1)
{
qun[j].v--;
qun[j].top=i;
q[add]=qun[j].no;
add++;
su=1;
}break;
}
}
if(su==0)
for(j=0;j<m;j++)
{
if(i+1==n&&qun[j].no==q[0])//qun[0]因为排序过所以会变的qun[j].no==q[0]时头尾相邻了,舍去
continue;
if((i-qun[j].top)!=1&&qun[j].v>=1)
{
qun[j].v--;
qun[j].top=i;
q[add]=qun[j].no;
add++;
su=1;
break;
}
}
if(su==0)
{
printf("-1\n");
return 0;
}
}
for(i=0;i<add;i++)
{
printf("%d ",q[i]+1);
}
printf("\n");
return 0;
}
如:6 3
1 2 3
输出:
3 2 3 1 2 3 就错
而是:3 2 3 2 3 1