问题 F: 最小重量机器设计问题
时间限制: 1Sec 内存限制: 128MB 提交: 115 解决: 0
题目描述
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设Wij 是
从供应商j处购得的部件i的重量,Cij 是相应的价格。
试设计一个算法,给出总价格不超过c的最小重量机器设计。
′编程任务:
对于给定的机器部件重量和机器部件价格,编程计算总价格不超过d的最小重量机器设
计。
输入
第一行有 3 个正整数 n ,m和 d。接下来的 2n 行,每
行m个数。前n行是c,后n行是w。
输出
将计算出的最小重量,以及每个部件的供应商输出
样例输入
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
样例输出
1 #include<bits/stdc++.h>
2 #define MAX_N 4000
3
4 int n,m,d,minW;
5 int w[MAX_N][MAX_N];
6 int c[MAX_N][MAX_N];
7 int bf[MAX_N]; //buy from
8 int r[MAX_N]; //result
9
10 void determ(int i, int cc, int cw){
11 if(i==n){
12 minW = cw;
13 for(i=0;i<n;i++){
14 r[i] = bf[i];
15 }
16 return;
17 }
18 for(int j=0;j<m;j++){
19 if(cc+c[i][j]<=d && cw+w[i][j]<minW){
20 bf[i] = j;
21 determ(i+1, cc+c[i][j], cw+w[i][j]);
22 }
23 }
24 }
25
26 int main(){
27 int i,j;
28 scanf("%d%d%d",&n,&m,&d);
29 for(i=0;i<n;i++){
30 for(j=0;j<m;j++){
31 scanf("%d",&c[i][j]);
32 }
33 }
34 for(i=0;i<n;i++){
35 for(j=0;j<m;j++){
36 scanf("%d",&w[i][j]);
37 }
38 }
39 minW = INT_MAX;
40 determ(0,0,0);
41 if(minW != INT_MAX){
42 printf("%d\n",minW);
43 for(i=0;i<n;i++){
44 printf("%d ",r[i]+1);
45 }
46 }
47
理解2:
1 #include<stdio.h>
2 #define n 3 //部件数
3 #define m 3 //供应商
4 #define d 4 //总价格不超过d
5 int w[n][n]={1,2,3,3,2,1,2,2,2},c[n][n]={1,2,3,3,2,1,2,2,2};
6 int a[n]={0},final[n]={0}; //final记录部件的最终供应商,a记录过程中的供应商
7 int minweight=1000000; //最终的最小质量
8 int weight=0,value=0; //两个过程值
9 void traceback(int t){
10 if(t==3&&value<=d){
11 if(weight<minweight){
12 minweight=weight;
13 for(int k=0;k<n;k++){
14 final[k]=a[k];
15 }
16 }
17 return;
18 }
19 if(value<=d){
20 for(int i=0;i<m;i++){ //遍历的是供应商
21 a[t]=i; //记录一下当前的这个部件是从哪个供应商购得
22 weight+=w[t][i];
23 value+=c[t][i];
24 traceback(t+1);
25 value-=c[t][i];
26 weight-=w[t][i];
27 a[t]=0;
28 }
29 }
30 }
31
32 int main(){
33 traceback(0); //t代表部件
34 printf("%d\n",minweight);
35 for(int i=0;i<n;i++)
36 printf("%d ",final[i]+1);
37 printf("\n");
38 return 0;
39
问题 D: 最多约数问题
时间限制: 1Sec 内存限制: 128MB 提交: 67 解决: 14
题目描述
正整数x 的约数是能整除x 的正整数。正整数x 的约数个数记为div(x)。例如,1,2,
5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b,找出a 和b
之间约数个数最多的数x
输入
输入2 个正整数a≤b≤5000000,编程计算a 和b 之间约数个数最多的数。
输出
程序运行结束时,找到a 和b 之间约数个数最多的数是x,将div(x)输出
样例输入
样例输出
9
问题分析:任何一个数都能分解成几个素数乘积的形式,例如6的约数有1,2,3,6,且6分解成素数相乘6=2*3,
在比如36的约数有1,2,3,4,6,9,12,18,36,且36分解成素数相乘36=2*2*3*3=2^2*3^2,通过规律我们可以发现
一个数约数的个数等于它分解成素数相乘后各素数指数加一的乘积,像36约数指数的个数就直接可以以(2+1)*(2+1)=9个来计算。
1 int prime(int n){//i注意上界
2 for(int i=2;i*i<n;i++)
3 if(n%i==0)
4 return 0;
5 return 1;
6 }
7
8 int main(){
9 int a,b;
10 int result,maxvalue=-9999;
11 int temp,count;
12 scanf("%d%d",&a,&b);
13 for(int i=a;i<=b;i++){
14 temp=i;
15 result=1;
16 for(int j=2;j<i;j++){
17 if(prime(j)){
18 count=0;
19 while(temp%j==0){
20 count++;
21 temp/=j;
22 }//指数加一乘积
23 result*=count+1;
24 }
25 }
26 if(result>maxvalue)
27 maxvalue=result;
28 }
29 printf("%d\n",maxvalue);
30 return 0;
31
问题 E: 班级人数
时间限制: 1Sec 内存限制: 128MB 提交: 29 解决: 22
题目描述
某班学生参加程序设计大赛,最后结果及格有超过P%但不足Q%的人。现在给你P和Q,你要算出该班最少有多少人。(数据弱了一点,所以好通过)。
输入
两个实数P,Q。用空格隔开。每个数最多有两位小数。0.00<=p<q<=99.99
输出
神风堂最少的人数。
样例输入
样例输出
1 #include<stdio.h>
2 int main()
3 {
4 float p,q;
5 int i;
6 while(scanf("%f%f", &p, &q)==2)
7 {
8 for(i = 1; ; i++)
9 {
10 //求相等的时候
11 if((int)(i*q/100.0)-(int)(i*p/100.0) == 1)
12 {
13 printf("%d\n",i);
14 break;
15 }
16 }
17 }
18
19 return 0;
20
问题 J: 战场的数目
时间限制: 1Sec 内存限制: 128MB 提交: 24 解决: 15
题目描述
在上题中,假设战场的图形周长为p,一共有多少种可能的战场?
例如,p<8时没有符合要求的战场,p=8时有2种战场:
p=10有9种战场:
要求输出方案总数模987654321的值。
输入
输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周长。p=0表示输入结束,你的程序不应当处理这一行。
输出
对于每组数据,输出仅一行,即满足条件的战场总数除以987654321的余数。
样例输入
样例输出
问题 I: 核电站问题
时间限制: 1Sec 内存限制: 128MB 提交: 33 解决: 16
题目描述
一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续3个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。现在,请你计算:对于给定的N,求不发生爆炸的放置核物质的方案总数。
输入
输入文件只有多行,每行对应一个正整数N<=40;
输出
输出文件有多行,每行只有一个正整数,表示方案总数
样例输入
样例输出