灵感源自于刷题时看到的一道题
以下是题解
总感觉很麻烦啊
#include <stdio.h>
#define MAX 305
int main()
{
int T = 0;
scanf("%d", &T); ///获取测试数据组数
while(T--)
{
int weight_people[MAX]; ///记录每个人的体重的数组
int vis[MAX]; ///记录每个人是否被删除的数据,vis[i] = 0表示这个人已经被运走,不能进行组合
int weight = 0; ///船的最大载重数
int num_people = 0; ///人的数量
scanf("%d%d", &weight, &num_people);
for(int i = 0; i < num_people; i++)
{
scanf("%d", &weight_people[i]); ///循环输入每个人的体重
vis[i] = 1; ///标记每个人
}
int ans = 0; ///总集合数
for(int i = 0; i < num_people; i++) ///循环遍历
{
if(0 == vis[i]) ///如果这个人被运走,计算下一个人
{
continue;
}
int key = -1; ///判断是否有人组合
int max = -2; ///目前组合的体重
for(int j = 0; j < num_people; j++)
{
if(0 == vis[j] || i == j) ///如果这个人被运走或者和进行比对的人重复,计算下一个人
{
continue;
}
if(weight_people[i] + weight_people[j] <= weight) ///如果装的下两个人
{
if(weight_people[i] + weight_people[j] > max) ///这两个人的体重最大
{
key = j;
max = weight_people[i] + weight_people[j];
}
}
}
if(-1 != key) ///如果装的下两个人
{
vis[i] = vis[key] = 0; ///标记这两个人
ans ++; ///总集合数+1;
}
if(-1 == key) ///没有能与a组合的人,独自上船
{
vis[i] = 0;
ans++;
}
}
printf("%d\n", ans);
}
}
或者习惯用c++的可以看下这个
#include<iostream>
using namespace std;
int main()
{
int s,w,n;
cin >> s;
while(s--)
{
cin >> w >> n;
int a[300+5]={0};
for(int i=0 ; i<n ; i++)
{
cin >> a[i];
}
int temp;
for(int i=0 ; i<n-1 ; i++)
{
for(int j=0 ; j<n-i-1 ; j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
int cnt=0;
for(int i=0,j=n-1 ; i<=j;)
{
if(a[i]+a[j]<=w)
{
cnt++;
i++;
}
else
{
cnt++;
}
j-- ;
}
cout << cnt <<endl;
}
return 0;
}
有任何别的见解欢迎评论区留言!