解题思路:

根据回溯法,首先画出解空间,解空间就是按照深度优先遍历的得到最优解的叉树(不一定是二叉树)

2017-12-13 23-26-04屏幕截图.png

2017-12-13 23-28-49屏幕截图.png

2017-12-13 23-27-18屏幕截图.png




注意事项:
回溯超时,别提交;

参考代码:

#include <stdio.h>

int T, m, time[101], value[101], pvalue = 0, maxvalue = 0;
int tanxin( int i );


void function( int i );


/*-----------------------------------------------------*/
int main()
{
    while ( (scanf( "%d%d", &T, &m ) ) != EOF )
    {
        maxvalue    = 0;
        pvalue        = 0;

        for ( int i = 0; i < m; i++ )

            scanf( "%d%d", &time[i], &value[i] );
        function( 0 );
        printf( "%d\n", maxvalue );
    }
}


/*-----------------------------------------------------*/
void function( int i )
{
    if ( i >= m )
    {
        if ( maxvalue < pvalue )
        {
            maxvalue = pvalue;
        }
        return;
    }

    if ( T >= time[i] )
    {
        pvalue    += value[i];
        T    -= time[i];

        function( i + 1 );

        pvalue -= value[i];

        T += time[i];
    }
    if ( tanxin( i + 1 ) > maxvalue )
        function( i + 1 );

    return;
}


int tanxin( int i )
{
    int    left    = T;
    int    b    = pvalue;

    while ( i <= m && time[i] <= T )
    {
        left    -= time[i];
        b    += value[i];
        i++;
    }

    if ( i <= m )
        b += value[i] * (1.0 * left / time[i]);

    return(b);
}


点赞(7)
 

0.0分

11 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 9 条评论

无忧草 1年前 回复TA
@duaiduai 大佬哎
后同学 4年前 回复TA
@后同学 有大佬指教一下吗?
后同学 4年前 回复TA
#include<stdio.h>
int main()
{
	int t,m,t1=0;
	scanf("%d %d",&t,&m);
	int i,p;
	int a[100],b[100];
	float c[100],o;
	int b1=0;
	for(i=0;i<m;i++)
	{
		scanf("%d %d",&a[i],&b[i]);
		c[i]=b[i]*1.0/a[i]*1.0;
	}
		
	for(i=0;i<m;i++)
	{
		
		for(p=i;p<m;p++)
		{
			if(c[i]<c[p])
			{
				o=c[i];
				c[i]=c[p];
				c[p]=o;
				
				o=a[i];
				a[i]=a[p];
				a[p]=o;
				
				o=b[i];
				b[i]=b[p];
				b[p]=o;	
			}
		}
		
	}
	
	for(i=0;i<m;i++)
	{
		if((t1+a[i])>t)
		{
			continue;
		}
	
		t1=t1+a[i];
		b1=b1+b[i];
	}
	printf("%d",b1);
}
GXMC 4年前 回复TA
动态规划,简单的背包问题

import java.util.*;
public class Main {
	static Scanner sc=new Scanner(System.in);
	static final int N=1010;
	static int []f=new int[N];
	static int []v=new int[N];
	static int []w=new int[N];
	
	public static void main(String[] args) {
		int m=sc.nextInt(),n=sc.nextInt();
		for(int i=1;i<=n;i++) {
			v[i]=sc.nextInt();
			w[i]=sc.nextInt();
		}
		for(int i=1;i<=n;i++) {
			for(int j=m;j>=v[i];j--) {
				f[j]=Math.max(f[j], f[j-v[i]]+w[i]);
			}
		}
		System.out.println(f[m]);
		
	}
}
wudi 4年前 回复TA
动态规划01背包

#include <stdio.h>
#define Max 1001

int f[Max][Max]={0};
int price[Max]={0};
int time[Max]={0};

int B(int k,int t)
{
	for(int i=1;i<=k;i++)
	{
		for(int j=1;j<=t;j++)
		{
			if(time[i]>j) f[i][j]=f[i-1][j];
			else {
				int a=f[i-1][j];
				int b=f[i-1][j-time[i]]+price[i];
				if(a>=b) f[i][j]=a;
				else f[i][j]=b;
			}
		}
	}
	printf("%d\n",f[k][t]);	
}

int main()
{
	int T,M;
	scanf("%d%d",&T,&M);
	for(int i=1;i<=M;i++)
		scanf("%d%d",&time[i],&price[i]);
	B(M,T);
	return 0;
}

/*
50 5
20 10
30 5
40 18 
20 9
10 12
*/
追猫的熊 5年前 回复TA
大佬,俺有个地方没看懂。贪心算法未必最优,为何只有当tanxin(i+1)>max时才跳到另一支?
逻辑幻象 5年前 回复TA
同样是超时  囧
#include<stdio.h>
#include<string.h>
struct node{
	int a,b;
};
typedef struct node list;
list A[105]; 
list s;
int sum,k;
int T,M;

void jisuan(int star,list s ){
	if(star==k){
		if(s.b>sum){
			sum=s.b;
		}
		return;
	}
	int i;
	int x=s.a;
	int y=s.b;
	//printf("s.a=%d\n",y);
	for(i=star;i<k;i++){
		s.a+=A[i].a;
		if(s.a<=T){
		    s.b+=A[i].b;
		    //printf("s.b=%d\n",s.b );
		    if(s.b>sum){
		    	sum=s.b;
		    	//printf("sum=%d\n",sum);
		    }
		    jisuan(i+1,s);
		}
	    s.a=x;
	    s.b=y;
	}
}
int main(){
	while(scanf("%d %d",&T,&M)!=EOF){
		int i,t1,t2;
		k=0;
		sum=0;
duaiduai 6年前 回复TA
我也是超时,不过你的代码看起来逻辑性太差~
#include<stdio.h>
int  max(int a,int b)
{
	return a>b?a:b;
}
int solve(int a[],int b[],int T,int M) //函数功能:a数组存储M种药的采药时间,b数组存储M种药的价值,M表示剩下M种药可选,返回值为总价值。
{
	if(M==0)
		return 0;
	if(a[M-1]<=T)
		return max(solve(a,b,T-a[M-1],M-1)+b[M-1],solve(a,b,T,M-1));
	else return solve(a,b,T,M-1); 
}
int main()
{
		int T,M;
	scanf("%d%d",&T,&M);
	int a[M],b[M];
	for(int i=0;i<M;i++)
		scanf("%d%d",&a[i],&b[i]);
		printf("%d",solve(a,b,T,M));
	
}
lalalala 6年前 回复TA
大佬,有一丝丝麻烦~~~