poj 1416 Shredding Company 模拟+枚举

题意:

给一个目标数和一个待分割数,可以对待分割数进行任意划分,比如将带分割数12305分为12,30,5,问将分好的数加起来最接近且不超过目标数的分割方案。

分析:

关键是在对带分割数的任意划分,直接for循环枚举状态,比如状态10101(二进制)表示将12305分为1,23,05.

代码:

#include <iostream>
#include <vector>
using namespace std;
int t,len;
char a[12];
int vis[1000010];
int sta[1000010];
int tmp[12];
vector<int> ans[1024];

int get_num(int l,int r)
{
	int i,sum=0;
	for(i=l;i<=r;++i)
		sum=10*sum+(a[i]-'0');
	return sum;
}

void generate(int p)
{
	ans[p].clear();
	int s=p;
	for(int i=len-1;i>=0;--i,p/=2)
		tmp[i]=p%2;
	int l=0,sum=0;
	for(int i=0;i<len;++i)
		if(tmp[i]==1){
			int num=get_num(l,i);
			l=i+1;
			sum+=num;
			ans[s].push_back(num);
		}
	++vis[sum];
	sta[sum]=s;
}

int main()
{
	while(scanf("%d%s",&t,a)==2){
		if(t==0&&a[0]=='0')
			break;
		memset(vis,0,sizeof(vis));
		int i;
		len=strlen(a);
		for(i=0;i<(1<<len);++i)
			if(i%2==1)
				generate(i);
		int flag=0;
		for(i=t;i>=1;--i)
			if(vis[i]>1){
				printf("rejected\n");
				flag=1;
				break;
			}else if(vis[i]==1){
				printf("%d ",i);
				int s=sta[i];
				for(int j=0;j<ans[s].size();++j)
					printf("%d ",ans[s][j]);
				printf("\n");
				flag=1;
				break;
			}
		if(flag==0)
			printf("error\n");
	}
	return 0;
} 
时间: 2024-08-26 08:33:36

poj 1416 Shredding Company 模拟+枚举的相关文章

搜索+剪枝 POJ 1416 Shredding Company

POJ 1416 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5231   Accepted: 2964 Description You have just been put in charge of developing a new shredder for the Shredding Company Although a "normal" shredder would

poj 1416 -- Shredding Company

Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4114   Accepted: 2324 Description You have just been put in charge of developing a new shredder for the Shredding Company Although a "normal" shredder would just shre

POJ 1416 Shredding Company【dfs入门】

题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6860   Accepted: 3710 Description You have just been put in charge of developing a new shredder for the Shredding Company Although a "

poj 1416 Shredding Company (DFS)

Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4595   Accepted: 2633 Description You have just been put in charge of developing a new shredder for the Shredding Company Although a "normal" shredder would just shre

poj 1416 Shredding Company (dfs)

链接:poj 1416 题意:有一种新的碎纸机,要用新的碎纸机将纸条上的数字切成几部分, 求切完后的和最接近而不超过target的值. 比如,target的值是50,而纸条上的数字是12346,应该把数字切成四部分, 分别是1.2.34.6.所得到的和43 (= 1 + 2 + 34 + 6) 是不超过50的最大和 比如1, 23, 4, 和6 ,和为34,比43小, 而12, 34, 6不可以,因为它们的和超过50了. 碎纸还有以下三个要求: 1.如果target的值等于纸条上的值,则不能切.

DFS/POJ 1416 Shredding Company

1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int mmax,sum; 5 char s[10]; 6 bool v[10],way[10]; 7 bool rejected; 8 void dfs(int dep,int value,int before) 9 { 10 int now=0; 11 for (int i=before;i<dep;i++) 12 { 13 now=now*10

【POJ 1416】 Shredding Company

[POJ 1416] Shredding Company dfs貌似不剪枝也能过 数据水水的 不过练练剪枝拓一下思路 每组两个数t num 输入0 0结束 分割数字num为任意组 让这几组加和最接近t(且<=t) 无解输出error 多解输出rejected 否则输出加和还有分割情况 做搜索剪枝有点小经验 搜索的时候逆向搜索 求最大就从大往小搜 求最小就从小往大搜 这样一出现不足(求最大时)或溢出(求最小) 立即return 即可实现高效剪枝 因为此时后继情况均比当前小(大)(为其枝叶) 此题还

Shredding Company (hdu 1539 dfs)

Shredding Company Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 445    Accepted Submission(s): 124 Problem Description You have just been put in charge of developing a new shredder for the Sh

poj 3399 Product(模拟)

# include <stdio.h> # include <string.h> # include <algorithm> using namespace std; int cmp(int x,int y) { return x>y; } int main() { int a[110],a1[110],a2[110],ans[110]; int n,k,k1,k2,i,k3; while(~scanf("%d%d",&n,&k