P2089 烤鸡

1|0康复训练的第一道搜索

调了一个小时,这是原来的代码

#include <iostream> #include <cstring> using namespace std; int n; int ans[500][11], count; void dfs(int step, int sum) { if (step > 10 || sum <= 0) { return; } if (step == 10 && sum <= 3) { ans[count][step] = sum; count++; return; } for (int i = 1; i < sum; i++) { ans[count][step] = i; dfs(step + 1, sum - i); } return; } int main() { cin >> n; dfs(1, n); cout << count << endl; for (int i = 0; i < count; i++) { for (int j = 1; j <= 10; j++) { cout << ans[i][j] << " "; } cout << endl; } return 0; }

除了内存开小了以外有一个大问题,出在存答案的数组上。 我的方案数都对,案例输出2的位置也都对,但很多地方不是1而是0,即数组的默认值。

我想了很久,觉得这些地方根本没被赋值,count++之后,本应该作为前面答案的数列只赋值给了原来的count那一维。

我的解决方案是再开一个temp数组,专门存储一个count内的有效答案,再把整个temp赋给ans。这是AC代码。

/********************************************************************* 程序名: 版权: 作者: 日期: 2023-10-07 16:58 说明: *********************************************************************/ #include <iostream> #include <cstring> using namespace std; int n; int temp[11], count; int ans[20100][11]; void dfs(int step, int sum) { if (step > 10 || sum <= 0) { return; } if (step == 10 && sum <= 3) { temp[10] = sum; for (int i = 1; i <= 10; i ++) { ans[count][i] = temp[i]; } count++; return; } for (int i = 1; i <= 3; i++) { temp[step] = i; dfs(step + 1, sum - i); } return; } int main() { cin >> n; dfs(1, n); cout << count << endl; for (int i = 0; i < count; i++) { for (int j = 1; j <= 10; j++) { cout << ans[i][j] << " "; } cout << endl; } return 0; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17776971.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示