状态便利问题

夜月岛 2013-06-03 10:52:15
比如说状态11111111111
我做动态规划题
如何遍历出11000000000,10000000010,10010000000等等(所有有两个1的状态)或(多个一的状态)
能否给段范例代码啊
...全文
113 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
夜月岛 2013-06-03
  • 打赏
  • 举报
回复
我想到了 还是用BFS广搜找状态好了 我在我们学校OJ上刷DP题 状态必须由少到多的
赵4老师 2013-06-03
  • 打赏
  • 举报
回复
关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
赵4老师 2013-06-03
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
    int s[256];
    int i;
    memset(s,0,sizeof(s));
    memset(count,0,sizeof(count));
    m=strlen(str);
    while(*str) {
        s[*str]++;
        str++;
    }
    n=0;
    for (i=0;i<256;i++)
        if (s[i]) {
            map[n]=i;
            count[n]=s[i];
            n++;
        }
}
void Find(int depth) {//递归式回溯法生成全排列
    if (depth==m) {
        int i;
        for (i=0;i<depth;i++) putchar(map[stack[i]]);
        putchar('\n');
    } else {
        int i;
        for (i=0;i<n;i++)
            if (count[i]) {
                stack[depth]=i;
                count[i]--;
                Find(depth+1);
                count[i]++;
            }
    }
}
void main(int argc,char**argv) {
    if (argc<2) {
        printf("%s 要产生全排列的字符串\n",argv[0]);
        return;
    }
    Make_Map(argv[1]);
    Find(0);
}
lin5161678 2013-06-03
  • 打赏
  • 举报
回复
#include <stdio.h>

void dfs(char* str, int begin, int len)
{
	if(begin == len+1) 
		return;
		 
	puts(str); 
	for(int i=begin; i<len; ++i) 
	{
		str[i] = '0';
		dfs(str, i+1, len);
		str[i] = '1';	 
	}
} 
int main()
{
	char str[] = "11111111111";
	dfs(str, 0, sizeof str - 1); 
	return 0;
}
或者 转换为二进制输出
#include <stdio.h>
#include <limits.h> 

#define MAX 0x800u
char* getIntBitStr(int key)
{
	if(key<0 || key>MAX-1)
		return NULL;
		
	static char str[sizeof(int)*CHAR_BIT+1];
	
 	for(unsigned int flag=MAX>>1, i=0; flag!=0; flag >>= 1, ++i)
	 	str[i] = !!(key & flag)+'0';
	 	
	return str; 
} 

int main()
{
	for(int i=0; i<MAX; ++i)//i最大值 0x7FF 二级制 111 1111 1111 一共11个1
		puts(getIntBitStr(i)); 
	return 0;
}
starytx 2013-06-03
  • 打赏
  • 举报
回复
char str[] = "1001001000"; char *p = str; int i = 0; while(*p != '\0') { if(*p++ == '1') i++; } switch(i) case 1: // 一个1 break; case 2: // 两个1 ....
夜月岛 2013-06-03
  • 打赏
  • 举报
回复
特别是遍历两个三个这样好烦啊
夜月岛 2013-06-03
  • 打赏
  • 举报
回复
求范例代码可以不大神 有十个状态1111111111 遍历有1个1其它全为零的状态 然后遍历两个 然后3个 ... 最后10个 楼上说的我也想过就是想不出怎么写啊
starytx 2013-06-03
  • 打赏
  • 举报
回复
当成字符串,然后遍历,判断每位是否是'1',然后计数?
lin5161678 2013-06-03
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
C:\>qpl 11000000 00000011 00000101 00000110 00001001 00001010 00001100 00010001 00010010 00010100 00011000 00100001 00100010 00100100 00101000 00110000 01000001 01000010 01000100 01001000 01010000 01100000 10000001 10000010 10000100 10001000 10010000 10100000 11000000
仔细看了一下 是我审错题目了 你的对的
赵4老师 2013-06-03
  • 打赏
  • 举报
回复
引用 9 楼 lin5161678 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] 仅供参考
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
    int s[256];
    int i;
    memset(s,0,sizeof(s));
    memset(count,0,sizeof(count));
    m=strlen(str);
    while(*str) {
        s[*str]++;
        str++;
    }
    n=0;
    for (i=0;i<256;i++)
        if (s[i]) {
            map[n]=i;
            count[n]=s[i];
            n++;
        }
}
void Find(int depth) {//递归式回溯法生成全排列
    if (depth==m) {
        int i;
        for (i=0;i<depth;i++) putchar(map[stack[i]]);
        putchar('\n');
    } else {
        int i;
        for (i=0;i<n;i++)
            if (count[i]) {
                stack[depth]=i;
                count[i]--;
                Find(depth+1);
                count[i]++;
            }
    }
}
void main(int argc,char**argv) {
    if (argc<2) {
        printf("%s 要产生全排列的字符串\n",argv[0]);
        return;
    }
    Make_Map(argv[1]);
    Find(0);
}
楼主的题目 根本不是求全排列 好吧[/quote] C:\>qpl 11000000 00000011 00000101 00000110 00001001 00001010 00001100 00010001 00010010 00010100 00011000 00100001 00100010 00100100 00101000 00110000 01000001 01000010 01000100 01001000 01010000 01100000 10000001 10000010 10000100 10001000 10010000 10100000 11000000
hugett 2013-06-03
  • 打赏
  • 举报
回复
用递归枚举第几个是1。。要多少个1就递归多少层。。
lin5161678 2013-06-03
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
仅供参考
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
    int s[256];
    int i;
    memset(s,0,sizeof(s));
    memset(count,0,sizeof(count));
    m=strlen(str);
    while(*str) {
        s[*str]++;
        str++;
    }
    n=0;
    for (i=0;i<256;i++)
        if (s[i]) {
            map[n]=i;
            count[n]=s[i];
            n++;
        }
}
void Find(int depth) {//递归式回溯法生成全排列
    if (depth==m) {
        int i;
        for (i=0;i<depth;i++) putchar(map[stack[i]]);
        putchar('\n');
    } else {
        int i;
        for (i=0;i<n;i++)
            if (count[i]) {
                stack[depth]=i;
                count[i]--;
                Find(depth+1);
                count[i]++;
            }
    }
}
void main(int argc,char**argv) {
    if (argc<2) {
        printf("%s 要产生全排列的字符串\n",argv[0]);
        return;
    }
    Make_Map(argv[1]);
    Find(0);
}
楼主的题目 根本不是求全排列 好吧

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧