题解:UVA574 Sum It Up
这种题怎么评的绿。
Problem
给定一个长度为 10+5+3
是符合要求的,但是 3+10+5
不符合要求。
多组数据,以两个
Solution
Idea
首先要降序,不妨把
暴力 dfs 每一个数选不选。选的话就把它加到答案里面去并更新和。
然后只要在最后判断是否不重复即可。
如何判断不重复?我们要把以往的答案存起来。注意为了防止多测不清空导致的错误,我们把没有用到的答案数组
另外一个剪枝:如果还没有枚举完,但是和已经比
Code
#include<bits/stdc++.h>
using namespace std;
int n,t,a[15];
int p[15],ans[1025][15],len,fl;
int cnt;
bool check(){
for(int i=1;i<=cnt;i++){
bool f=1;
for(int j=1;j<=12;j++){
if(ans[i][j]!=p[j]){
f=0;
break;
}
}
if(f)return true;
// printf("%d\n",i);
}
return false;
}
void dfs(int now,int sum){
if(sum>t)return;
if(now==n+1){
if(sum!=t)return;
for(int i=len+1;i<=12;i++)p[i]=-1;
if(check())return;
cnt++;
ans[cnt][1]=p[1];
fl=1;
for(int i=2;i<=len;i++){
ans[cnt][i]=p[i];
}
for(int i=len+1;i<=12;i++){
ans[cnt][i]=-1;
}
return;
}
else{
dfs(now+1,sum);
p[++len]=a[now];
dfs(now+1,sum+a[now]);
--len;
}
}
bool cmp(int _,int __){
return _>__;
}
int main() {
while(1) {
cnt=0;
len=0;
fl=0;
scanf("%d%d",&t,&n);
if(n==0&&t==0)break;
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
printf("Sums of %d:\n",t);
sort(a+1,a+n+1,cmp);
dfs(1,0);
if(!fl)printf("NONE\n");
else{
for(int i=cnt;i>=1;i--){
printf("%d",ans[i][1]);
for(int j=2;j<=12;j++){
if(ans[i][j]==-1)break;
printf("+%d",ans[i][j]);
}
printf("\n");
}
}
}
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】