称砝码 -动态规划 华为OJ

现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1x2……xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。

 

注:

称重重量包括0

要对输入数据进行校验

 

方法原型:public static int fama(int n, int[] weight, int[] nums)


知识点 字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
运行时间限制 10M
内存限制 128
输入

int nn表示有多少组重量不同的砝码,1<=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<>

int[] weight:表示n组砝码的重量,1<=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<>

int[] num:表示n组砝码的最大数量,1<=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<>


输出

利用给定的砝码可以称出的不同的重量数

样例输入 2 1 2 2 1
样例输出 5


#include   

using namespace std;  
 /*
 分析:创建一个数组,数组的需要用来标识有可能获得的砝码重量。数组大小为所有砝码重量相加。
      哪些需要被标记:1、 重量为0需要被标记(题目要求) (单独处理f[0]=true)
	                  2、每种砝码重量的倍数(数量不超过指定砝码的个数)
					  3、不同砝码之间的组合
	处理:
	     砝码种类为n,每种单个砝码的重量记录在weight[]中,每种砝码的数量记录在nums[]中
	     动态规划思想:
		 对每种砝码依次进行计算。

		 先对第一种砝码重量进行计算标记(标记的有m[0]*i,0=total_all) break;
				//若k=0,则sum为第二种砝码重量的整数倍,即给标记;
				//若flag[k]是被标记了的(之前砝码标记的重量)+weight[i]*j===》sum ,如果设个sum没有被标记那么,需要被标记
				if((flag[k] && !flag[sum])|| k==0)
					flag[sum]=true;
			}
			
		}
		  // 将本次放入一种砝码与之前的累加总和赋值给total  
            total = sum; 
	}
	//统计flag中被标记的数量
	int count=0;
	for(int i=0;i<=total_all;i++){
		if(flag[i]) count++;
	}
	return count;
}


void main(){

 int x[10], m[10]; 
int n;
//砝码种类
cin>>n;
//输出各种砝码的重量
for(int i=0;i>m[i];
//输入各种重量砝码的数量
for(int i=0;i>x[i];
  cout<


你可能感兴趣的:(C/C++,数据结构与算法,华为OJ,动态规划)