コード例 #1
0
void calculate2(int i,int j,int w[])
 {
   if(i==0||j==0)
     return ;
   if(K[i-1][j]==K[i][j])
     calculate2(i-1,j,w);
   else
    {
      calculate2(i-1,j-w[i],w);
      nib[i]=1;
    }
 }
コード例 #2
0
ファイル: postfix.c プロジェクト: foneandrew/CCalculator
/** assumes given postfix expression is valid */
int evaluatePostfixExpression( char *expr ){
	//create the stack
	stackNode2Ptr stack = malloc(sizeN);
	
	int x, y;
	int i = 0;
	char c = expr[i];
	//read entire expression
	while (c != '\0' && i < 80){
		
		//check what if c is digit or operator
		if (isdigit(c)){
			// c is a number, so push2 it onto stack
			x = c - '0';
			push2(&stack, x);
		} else {
			/* c must be an operator,
			 * so have to pop2 two elements from the stack and 
			 * apply the operation */
			 x = pop2(&stack);
			 y = pop2(&stack);
			 push2(&stack, calculate2(x, y, c));
		}
		c = expr[++i];
	}
	return pop2(&stack);
} 
コード例 #3
0
int main()
{
  int i,sum,c,oxsum,nisum,ox,ni,n;
  int oxygen[1001],nitrogen[1001],weight[1001];
  scanf("%d",&c);
  while(c--)
  {
    scanf("%d %d",&ox,&ni);
    scanf("%d",&n);
    oxsum=nisum=0;
    for(i=1;i<=n;i++)
      {
       scanf("%d %d %d",&oxygen[i],&nitrogen[i],&weight[i]);
       oxsum+=oxygen[i];
       nisum+=nitrogen[i];
      }
   // col=(ox>ni)?ox:ni;
    memset(oxb,0,sizeof(oxb));
    memset(nib,0,sizeof(nib));    
    knapsack(oxygen,weight,n,oxsum-ox);
    printk(n,oxsum-ox);
    calculate(n,ox,oxygen);
    knapsack(nitrogen,weight,n,nisum-ni);
    calculate2(n,ni,nitrogen);
    print(oxb,n);
    print(nib,n);
    sum=0;
    for(i=1;i<=n;i++)
      if(oxb[i]==0 || nib[i]==0)
        sum+=weight[i];
    printf("%d\n",sum);
  }
  return 0;
}    
コード例 #4
0
ファイル: cutfunction.cpp プロジェクト: zkaiwen/smflow
/*******************************************************
 *  calculate 
 *    Calculates the result of the node of a specific cut 
 *    This calculate ignores negation at inputs (NOT ALWAYS WORKS)
 *    *FUNCTION OF ADDER4 and ADDER_K_C
 *
 *  @PARAMS:
 *    node:    Node to calculate truth table for
 *    aigraph: AIG to be used
 *  @RETURN:   Function value at current node
 ********************************************************/
unsigned long long CutFunction::calculate2(unsigned node){
	node = node & 0xFFFFFFFE;	
	//printf("CURRENT NODE: %d\n", node);

	//Check to see if primary input
	std::map<unsigned int, unsigned long long>::iterator nvit;

	nvit = m_NodeValue.find((unsigned int) node);
	if(nvit != m_NodeValue.end()){
		//printf("VAL FOUND: %8llx\n", nvit->second);
		return nvit->second;
	}

	//Fix Negative edges for cuts
	unsigned node1, node2, child1, child2;
	child1 = m_AIG->getChild1(node);
	child2 = m_AIG->getChild2(node);

	node1 = child1 & 0xFFFFFFFE;
	node2 = child2 & 0xFFFFFFFE;


	//Recurse until primary input;
	unsigned long long result1 = calculate2(node1);
	unsigned long long result2 = calculate2(node2);

	//Handle Inverters only at points not at the input
	//printf("CHILDREG %u %u\n", child1, child2);
	if(child1 & 0x1){
		nvit = m_NodeValueIn.find((unsigned int) node1);
		if(nvit == m_NodeValueIn.end()){
			result1 = ~result1;
			//printf("CHILD INVERTED: %d\n", node1);
		}
		else{
			//printf("CHILD NOT INVERTED: %d\n", node1);

		}
	}

	if(child2 & 0x1){
		nvit = m_NodeValueIn.find((unsigned int) node2);
		if(nvit == m_NodeValueIn.end()){
			result2 = ~result2;
			//printf("CHILD INVERTED: %d\n", node2);
		}
		else{
			//printf("CHILD NOT INVERTED: %d\n", node2);

		}
	}

	//AND Operation
	//printf("Node %d IN: %d %d\n", node, child1, child2);
	//printf("c1: %8llx\n", result1);
	//printf("c2: %8llx\n", result2);
	unsigned long long result = result1 & result2;
	//printf("r : %8llx\n\n", result);
	m_NodeValue[node] = result;

	return result;
}
コード例 #5
0
ファイル: cutfunction.cpp プロジェクト: zkaiwen/smflow
/*******************************************************
 *  processAIGCuts_Perm
 *    Process each cut of each node
 *    Compares the result with library to see if there
 *    is a match in function
 *
 *    Takes into account permutation at this level
 ********************************************************/
void CutFunction::processAIGCuts_Perm(bool np){
	printf("[CutFunction] -- Calculating Function of Cuts Permutation Mode\n");

	//Go through each node and process all the cuts
	unsigned size = m_AIG->getSize() + m_AIG->getInputSize() + 1;
	for(unsigned int i = m_AIG->getInputSize()+1; i < size; i++){
		unsigned node = i * 2;
		//printf("############################################################################################################\n");
		//printf("--------------------------------\nProcessing node %d\n", node);
		std::list<std::set<unsigned> > cutList;
		std::list<std::set<unsigned> >::iterator cuts;

		m_CutEnumeration->getCuts(i, cutList); 

		//Go through each cut of the node
		for(cuts = cutList.begin(); cuts != cutList.end(); cuts++){

			//Skip trivial cut
			unsigned int inputSize = cuts->size();
			if(inputSize < 5)
				continue;

			//Permutation of indexes
			unsigned int* permutation = setPermutation(inputSize);

			std::set<unsigned>::iterator cutIT;
			//printf("NODE %d\t", i);

			//printf("CUT: ");
			std::vector<unsigned> gateInput;
			for(cutIT = cuts->begin(); cutIT != cuts->end(); cutIT++)
			{
				//printf("%d ", *cutIT);
				gateInput.push_back(*cutIT);
			}

			gateInput.push_back(node);
			//printf("\n");

			//P-Equivalence Check
			//Permutation of indexes

			std::set<unsigned long long> keyVals;

			do{
				/*printf("Permutation:\n");
					for(unsigned int i = 0; i < inputSize; i++){
					printf("%d ", permutation[i]);
					}
					printf("\n");
				 */

				int pIndex= 0;  //Index for permutation

				//printf("\n\nInputSize: %d\n", inputSize);
				//Set the assignments for the inputs
				for(cutIT = cuts->begin(); cutIT != cuts->end(); cutIT++){
					unsigned int permVal = permutation[pIndex];
					unsigned long long input = m_Xval[permVal];

					m_NodeValue[*cutIT] = input;
					m_NodeValueIn[*cutIT] = input;
					//printf("CUT: %d\tIV: %llx\n", *cutIT, input);

					pIndex++;      
				}

				//Calculate the output at each node up to the current node
				calculate2(node);

				unsigned long long functionVal = m_NodeValue[node];
				unsigned long long negateVal = ~(functionVal);
				//printf("OUTPUT: %x\n", negate);

				//N-Equivalence Check the negation of the output
				//Count the number of occurances for each unique function
				//Store the function that's smaller, whether negate or nodevalue
				unsigned long long functionKey = functionVal;
				if(negateVal < functionVal)
					functionKey = negateVal;

				//printf("KEY CHOSEN: %llx\n", functionKey);
				keyVals.insert(functionKey);
				//  printf("FUNCTION: %llx\n", functionVal);
				//  printf("NEGATED:  %llx\n\n", negateVal);

				std::map<unsigned long long, int>::iterator fcit;
				fcit = m_FunctionCount.find(functionKey);
				if(fcit == m_FunctionCount.end())
					m_FunctionCount[functionKey] = 1;                      
				else
					fcit->second++; 

				m_NodeValue.clear();
				m_NodeValueIn.clear();

			}while(std::next_permutation(permutation, permutation+inputSize));
			delete [] permutation;

			m_UniqueFunction[keyVals].push_back(gateInput);
		}

	}
}
コード例 #6
0
ファイル: Solver2.c プロジェクト: fernandoescolar/euler
int Solver2()
{
	return calculate2(0, 1, 4000000);
}
コード例 #7
0
ファイル: Solver2.c プロジェクト: fernandoescolar/euler
int calculate2(int current, int next, int limit)
{
    return current > limit ? 0 : (current%2 == 0 ? current : 0) + calculate2(next, current + next, limit);
}