最大连续邮资问题的JAVA实现
2008-09-17 17:40
603 查看
public class StampCost {
int m;
int n;
int stamps[];
int maxNum = 0;
int[] tempset;
int current;
int rightPos;
int base;
public StampCost(int m,int n,int[] stamps){
this.m = m;
this.n = n;
this.stamps = stamps;
check();
printResult();
}
public void check(){
tempset = new int[stamps[(stamps.length-1)]*4+1];
maxNum = m;//因为第一个确定是1,所以初始化最大的面值就是 1*m
for (int i=1;i<5;i++){
int min = Math.max(stamps[i],maxNum)+1;;
int max = stamps[i]*m;
if (min < stamps[i]+1){
return;
}
maxNum = min-1;
tempset[maxNum]=1;
if (!checkSpan(min,max,i)){
return;
}
}
}
public boolean checkSpan(int min,int max,int rightPos){
base = min;
current=stamps[rightPos];
this.rightPos = rightPos;
backtrace(0);
if (tempset[min] == 0){
return false;
}
for (int i=min;i<max;i++){
if (tempset[i] == 0){
return true;
}
else{
maxNum++;
}
}
return true;
}
public void backtrace(int i){
if (i >= (m-1)){
return;
}
else{
for (int j=0;j<rightPos+1;j++){
current += stamps[j];
if (current >= base){
tempset[current] = 1;
}
backtrace(i+1);
current -= stamps[j];
}
}
}
public void printResult(){
System.out.println(maxNum);
}
public static void main(String args[]){
int m=4;
int n=5;
int[] stamps={1,3,11,15,32};
new StampCost(m,n,stamps);
}
}
int m;
int n;
int stamps[];
int maxNum = 0;
int[] tempset;
int current;
int rightPos;
int base;
public StampCost(int m,int n,int[] stamps){
this.m = m;
this.n = n;
this.stamps = stamps;
check();
printResult();
}
public void check(){
tempset = new int[stamps[(stamps.length-1)]*4+1];
maxNum = m;//因为第一个确定是1,所以初始化最大的面值就是 1*m
for (int i=1;i<5;i++){
int min = Math.max(stamps[i],maxNum)+1;;
int max = stamps[i]*m;
if (min < stamps[i]+1){
return;
}
maxNum = min-1;
tempset[maxNum]=1;
if (!checkSpan(min,max,i)){
return;
}
}
}
public boolean checkSpan(int min,int max,int rightPos){
base = min;
current=stamps[rightPos];
this.rightPos = rightPos;
backtrace(0);
if (tempset[min] == 0){
return false;
}
for (int i=min;i<max;i++){
if (tempset[i] == 0){
return true;
}
else{
maxNum++;
}
}
return true;
}
public void backtrace(int i){
if (i >= (m-1)){
return;
}
else{
for (int j=0;j<rightPos+1;j++){
current += stamps[j];
if (current >= base){
tempset[current] = 1;
}
backtrace(i+1);
current -= stamps[j];
}
}
}
public void printResult(){
System.out.println(maxNum);
}
public static void main(String args[]){
int m=4;
int n=5;
int[] stamps={1,3,11,15,32};
new StampCost(m,n,stamps);
}
}
相关文章推荐
- 算法java实现--回溯法-连续邮资问题--子集树
- JAVA代码—算法基础:最大连续邮资问题求解
- 读《程序员编程艺术》之自造Java版本----最大堆排序实现最小K问题
- java最小堆实现优先权队列和求最大的n个数问题
- java实现字符串匹配问题之求两个字符串的最大公共子串
- 连续子数组最大和问题编程实现
- 《剑指offer》编程题java实现(十二):连续子数组的最大和
- 连续子序列最大和问题精讲(java实现)
- 算法导论:最大子数组问题(java实现)
- 数组问题之一维最大字段和问题<Java实现>
- 用分治法实现最大子数组问题(Java)
- 剑指Offer面试题31:连续数组的最大和 Java实现
- 三种算法求最大子段和问题——Java实现
- 算法java实现--回溯法--最大团问题
- 最大子数组问题分治法(递归)Java实现
- 数据结构与算法分析笔记与总结(java实现)--数组5:连续子数组的最大和
- 三种算法实现最大子段和问题(Java实现)
- Java实现——数组中连续元素子数组的和最大
- 最大子数组问题(三种方式,java实现)
- 一维数组及子数组最大和问题Java实现