分析:
看似这道题的题目很长,但是总结起来就是求一个最小的子集。
所以我们用dfs来把它所有子集列出来,然后找一个最小的就可以了。
#include<stdio.h>
#include<math.h>
#define min(a,b) a<b?a:b
int n;
unsigned ans=-1;
struct food
{
int s;
int b;
}perket[10];
void dfs(int num,int ssum,int bsum)
{
if(num>=n) return;
for(int i=num+1;i<n;i++)
{
ans=min(ans,abs(ssum*perket[i].s-bsum-perket[i].b));
// printf("ans is %u\n",ans);
dfs(i,ssum*perket[i].s,bsum+perket[i].b);
}
}
main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&perket[i].s,&perket[i].b);
}
dfs(-1,1,0);
printf("%u",ans);
}
本文介绍了一种使用深度优先搜索(DFS)算法寻找满足特定条件的最小子集的方法。通过列举所有可能的子集并从中挑选符合条件的最小集合,解决了一个具体的数学问题。

691

被折叠的 条评论
为什么被折叠?



