谷歌笔试题-背包问题

来源:互联网 发布:小型图书馆源码 编辑:程序博客网 时间:2024/04/24 01:09

将一个较大的钱,不超过1000000(10^6)的人民币,兑换成数量不限的100、50、10、5、2、1的组合。

此题考查的是一个比较简单的完全背包问题,但是有一个陷阱,注意数据的取值范围,整型数会溢出。


#include <stdlib.h>#define N 1000005long long c[N];int change[] ={1,2,5,10,50,100};long long  findChange(int sum, int* change,int n){int i = 0, j = 0;c[0] = 1;for(; i < n; i++){for(j = change[i]; j <= sum; j++){c[j] = c[j - change[i]] + c[j];}}return c[sum];}int main(){int result = findChange(1000000,change,6);printf("total kinds: %lld",result);getchar();}