首页 > 试题广场 >

给你一个数小于1000000,分别用100,50,20,10

[问答题]
给你一个数小于1000000,分别用100,50,20,10,5块表示出来,有多少种表示方法。写出算法即可。
public static int getCount(int sum){
    int count = 0;
    for(int i = 0; i <= sum/5; i++){
      for(int j = 0; j <= sum/10; j++){
        for(int k = 0; k <= sum/20; k++){
          for(int p = 0; p <= sum/50; p++){
            for(int q = 0; q <= sum/100; q++){
              if(5*i + 10*j + 20*k + 50*p + 100*q > sum){
                continue;
              } else if (5*i + 10*j + 20*k + 50*p + 100*q == sum){
                System.out.println(i+","+j+","+k+","+p+","+q);
                ++count;
              }
            }
          }
        }
      }
    }
    return count;
}

发表于 2014-11-01 23:13:49 回复(0)
#include <cstdio>
#include<vector>
#include<unordered_map>
using namespace std;
int base[] = { 5, 10, 20, 50, 100 };
unordered_map<int, int> store[5];
int getTotal(int num, int index){
	int total = 0;
	if (index == 0)
		return 1;
	int groups = num / base[index];
	for (int i = 0; i <= groups;i++){
		total += getTotal(num - base[index] * i, index - 1);
	}
	store[index].insert(make_pair(num, total));
	return total;
}
int main(){
	int n;
	scanf("%d", &n);
	if (n % 5 != 0||n==0)
		printf("0");
	int i;
	for (i = 4; i >= 0;i--)
		if (n >= base[i])
			break;
	printf("%d", getTotal(n, i)); 
	system("pause");
	return 0;
}

发表于 2015-07-09 14:25:26 回复(2)
xxj头像 xxj
算法如下:设置这个数值为N
首先将这个数字N使用5块分出,即这个数字N共有n个五块可以表示出来
然后分别:100有20个5块
50有10个5块
20有4个5块
10有2个5块
5有1个5块
最后使用绑定法来求解最后值,
比如将n个5快以10个来绑定,穷举
最后完成分块
发表于 2014-11-27 10:08:58 回复(0)