请将下面的代码转换成C语言:#include<iostream> using namespace std; int n; int c; int final=0; //当前元素加到最后一个元素 的总和 int sum=0; //已选元素之和 int a[10000]; //原数组 bool b[10000]; //判断元素选不选 bool Backtrack(int t){ if(sum==c) return true; //已找到 if(t>n) return false; //未找到 final-=a[t]; //先减去该元素 if(sum+a[t]<=c){ //如果 已选元素之和 加上 该元素 小于等于c,则 b[t]=true; //选上该元素 sum+=a[t]; //已选元素之和 加上 该元素 if(Backtrack(t+1)) return true; //下一个元素Backtrack成功 返回true sum-=a[t]; //否则 减回去 } if(sum+final>=c){ //如果 已选元素之和 加上 当前元素加到最后一个元素的总和 大于等于c, 则 b[t]=false; //不选当前元素 if(Backtrack(t+1)) return true; //下一个元素Backtrack成功 返回true } final+=a[t]; //加回去 return false; //未找到 } int main(){ cin>>n>>c; for(int i=0;i<n;i++){ cin>>a[i]; final+=a[i]; } if(!Backtrack(0)) cout<<"No Solution!"<<endl; else{ for(int i=0;i<n;i++){ if(b[i]) cout<<a[i]<<" "; //如果该元素为ture,则输出 } } return 0; }
时间: 2024-04-23 16:22:05 浏览: 10
#include <stdio.h>
#include <stdbool.h>
int n;
int c;
int final = 0; //当前元素加到最后一个元素的总和
int sum = 0; //已选元素之和
int a[10000]; //原数组
bool b[10000]; //判断元素选不选
bool Backtrack(int t)
{
if (sum == c)
return true; //已找到
if (t > n)
return false; //未找到
final -= a[t]; //先减去该元素
if (sum + a[t] <= c)
{ //如果已选元素之和加上该元素小于等于c,则
b[t] = true; //选上该元素
sum += a[t]; //已选元素之和加上该元素
if (Backtrack(t + 1))
return true; //下一个元素Backtrack成功 返回true
sum -= a[t]; //否则 减回去
}
if (sum + final >= c)
{ //如果已选元素之和加上当前元素加到最后一个元素的总和大于等于c,则
b[t] = false; //不选当前元素
if (Backtrack(t + 1))
return true; //下一个元素Backtrack成功 返回true
}
final += a[t]; //加回去
return false; //未找到
}
int main()
{
scanf("%d %d", &n, &c);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
final += a[i];
}
if (!Backtrack(0))
printf("No Solution!\n");
else
{
for (int i = 0; i < n; i++)
{
if (b[i])
printf("%d ", a[i]); //如果该元素为true,则输出
}
}
return 0;
}