1. 程式人生 > >n個數 取任意個數相加求和的個數

n個數 取任意個數相加求和的個數

// MicroSofrInterviewProblem2.cpp : Defines the entry point for the console application.
//有若干個給定的數(都小於N),問從中任意取幾個數相加,可以得到多少個不同的結果.
//處理這種類似揹包的時候,注意內層迴圈一定要memcpy重建一個副本,不然會陷入死迴圈並越界。如題,j = 0, 當0 + 1記錄在record[1],下一次record[1]也是1了就那麼reocrd[2]也會賦值為1,直到迴圈結束,這樣程式就掛了。
//類似的一共有多少種可能性的問題,都會出現類似的問題。需要注意。

#include "stdafx.h"
#include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAX 100 int poscount(int* input, int len) { if (input == NULL || len == 0) return 0; int count = 1; char record[MAX] = { 0 }; record[0] = 1; printf("0 "); int i = 0; for (; i<len; i++) { int
j; char tmp[MAX]; memcpy(tmp, record, MAX); for (j = 0; j<MAX; j++) { if ((record[j] == 1) && (record[j + input[i]] == 0)) { tmp[j + input[i]] = 1; printf("%d ", j + input[i]); count++; } } memcpy
(record, tmp, MAX); } printf("\ncount = %d \n", count); return count; } int main() { int input[] = { 1,2,3,5 }; poscount(input, sizeof(input) / sizeof(int)); while (1); }

相關推薦

n個數 任意個數相加求和個數

// MicroSofrInterviewProblem2.cpp : Defines the entry point for the console application. //有若干個給定的數(都

C語言輸入十個數任意相鄰的兩個數不同,輸出所有的遞增,遞減序列

int main(int argc, const char *argv[]) {     int a[10];     for (int i=0; i<10; i++) {         scanf("%d", &a[i]);     }     printf("%d ", a[0]);

LightOJ - 1117 Helping Cicada (求1~n有多少個數不能被這m個數任意一個整除)(容斥+狀態壓縮)

vol == show fine cst href main http color 題意:http://www.lightoj.com/volume_showproblem.php?problem=1117 考慮1個數k,1~n有[n/k]個數能被k整除,[a]表示a向下取

【程式設計之美】任意給定一個32位無符號整數n,求n的二進位制表示中1的個數

任意給定一個32位無符號整數n,求n的二進位制表示中1的個數,比如n = 5(0101)時,返回2,n = 15(1111)時,返回4。這也是一道比較經典的題目了,相信不少人面試的時候可能遇到過這道題吧,我今天就遇到了,當時懵了。現在想想多簡單,浪費了一次機會。 1.普通法

N個數任意個使得異或和最大(高斯消元)

#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long lon

BZOJ3994:約數個數和(莫比烏斯反演:求[1,N]*[1,M]的矩陣的因子個數

Description  設d(x)為x的約數個數,給定N、M,求   Input 輸入檔案包含多組測試資料。 第一行,一個整數T,表示測試資料的組數。 接下來的T行,每行兩個整數N、M。 Ou

lintcode入門級-計算出n階乘中尾部零的個數

題目地址:https://www.lintcode.com/problem/trailing-zeros/description 我想法很簡單,算出數值大小,直接對尾部進行除法取餘找0: (function () { var trailingZeros = function

S="S1 S2...Sn"是一個長度為N的字串,存放在一個數組中,程式設計將S改造之後輸出:

S="S1 S2…Sn"是一個長度為N的字串,存放在一個數組中,程式設計將S改造之後輸出: 將S的所有第偶數個字元按照其原來的下標從大到小的次序放在S的後半部分; 將S的所有第奇數個字元按照其原來的下標從小到大的次序放在S的前半部分; 例如:S=‘ABCDEFGHIJKL’

【演算法】計算出n階乘中尾部零的個數

思路: 觀察1-20階乘的結果,觀察尾數為0的分佈情況 發現有一個5就會出現一個0 其中5!(有一個5),10!(有兩個5) 5!=120(一個0) 10!=3628800(兩個0) #include <stdio.h> long trailingZeros(long n) {

C語言使用memcpy函式實現兩個數任意位置的複製操作

  c和c++使用的記憶體拷貝函式,memcpy函式的功能是從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中。   用法:void *memcpy(void *dest, const void *src, size_t n); 舉例:   char tes

S="S1 S2...Sn"是一個長度為N的字串,存放在一個數組中,程式設計將S改造之後輸出:

S="S1 S2…Sn"是一個長度為N的字串,存放在一個數組中,程式設計將S改造之後輸出: 將S的所有第偶數個字元按照其原來的下標從大到小的次序放在S的後半部分; 將S的所有第奇數個字元按照其原來的下標從小到大的次序放在S的前半部分; 例如:S=‘ABCDEF

N條直線所劃分的平面個數

#include <stdio.h> #include <stdlib.h> int lines(int n) { if(n==1) return 2; else return n+lines(n-1); } int main() { int n,m; printf(

編寫一個程式,對輸入的四個數最大值和最小值

<span style="font-size:24px;">int a = int.Parse(Console.ReadLine()); int b = int.Parse(Console.ReadLine());

n節點組成二叉樹的個數

可以分析,當n=1時,只有1個根節點,則只能組成1種形態的二叉樹,令n個節點可組成的二叉樹數量表示為h(n),則h(1)=1; h(0)=0;        當n=2時,1個根節點固定,還有2-1個節點。這一個節點可以分成(1,0),(0,1)兩組。即左邊放1個,右邊

n階乘中尾部零的個數(JAVA)

描述 設計一個演算法,計算出n階乘中尾部零的個數 樣例 11! = 39916800,因此應該返回 2 挑戰 O(logN)的時間複雜度 所有可能造成尾部0的只有10的倍數,5的倍數,也就是求階乘中擁有的5的個數。 例如 11 = 1,2,3,4

每日一練——從長度為n的數組裡選出m個數使和為固定值sum

這個問題是我從leetcode上一道問題所想到的,原題:如果是從陣列中選出2個數相加使之成為固定的數sum,這當然很簡單,把陣列中的數字遍歷一遍,判斷另一個數字是否也在陣列中即可。程式碼如下。

演算法設計:有n個數,範圍是從1到n,且只有唯一的兩個數相同,如何最快的求相同的這個數值?

為了方便問題描述,假設n = 10,即陣列a[10]裡有10個數,範圍是從1到10,且裡面只有兩個數的值是相同的。如何求這個相同的數值。 常規思路: 1,先氣泡排序,然後用while迴圈找出這個相同的數值 2,直接用冒泡的思路,i從0到n-2,j = i+1,依次比,找出相

模方程解的個數 (迴圈節)

1046: 取模方程解的個數 時間限制: 1 Sec  記憶體限制: 128 MB 提交: 346  解決: 9 [提交][狀態][討論版][命題人:cyh] 題目描述 給定x和m,問在區間[a,

模方程解的個數

題目描述 給定x和m,問在區間[a,b]上存在多少個i,使得xi % 1000 = m。 輸入 輸入由多組資料構成。 每組資料一行,由四個空格分開的整數x、m、a和b組成。 0 <= x

設計一個演算法,計算出n階乘中尾部零的個數

考慮到只要有5,或者因子為5的數,就可以產生0的尾部。假如1*2*3*4*...*250,那麼250/5=50可以知道,有50個為5的倍數,但是裡面有多少個為25的倍數,125的倍數..., 50/5=10,可知25的倍數有10個,10/5=2,可知125的倍數有兩個,以此