递归:

#include <stdio.h>
#include <stdlib.h>

int n,m;
typedef struct Node
{
    int price;
    int value;
}node;
node *a;
/**递归:在第1,2,...,k号物品的“价格与重要度之积总和”已经达最大值的条件下(总价格不超过n),
当且仅当第k+1,k+2,...,m号物品的“价格与重要度之积总和”达最大值(总价格不超过n),
才有第1,2,...,m号的“价格与重要度之积总和”达最大值(总价格不超过n)
**/
int calc(int i,int capacity)
{
    if(i==m) return (capacity<a[i].price)?0:(a[i].price*a[i].value);
    if(capacity<a[i].price) return calc(i+1,capacity);
    return max(calc(i+1,capacity),calc(i+1,capacity-a[i].price)+(a[i].price*a[i].value));
}

int max(int a,int b)
{
    return a>b?a:b;
}

int main()
{
    int i,res;
    scanf("%d %d",&n,&m);
    getchar();

    a=(node*)malloc(sizeof(node)*(m+1));
    for(i=1;i<=m;i++)
        scanf("%d %d",&a[i].price,&a[i].value);
    res=calc(1,n);
    printf("%d",res);

    free(a);
    return 0;
}



递归(无重复计算)

#include <stdio.h>
#include <stdlib.h>

int n,m;
typedef struct Node
{
    int price;
    int value;
}node;
node *a;

int **store;

int calc(int i,int capacity)
{
    if(store[i][capacity]>=0) return store[i][capacity];
    if(i==m)
        {
            store[i][capacity]=(capacity<a[i].price)?0:(a[i].price*a[i].value);
            return store[i][capacity];
        }
    if(capacity<a[i].price) store[i][capacity]=calc(i+1,capacity);
    else store[i][capacity]=max(calc(i+1,capacity),calc(i+1,capacity-a[i].price)+(a[i].price*a[i].value));

    return store[i][capacity];
}

int max(int a,int b)
{
    return a>b?a:b;
}

int main()
{
    int i,j,res;
    scanf("%d %d",&n,&m);
    getchar();
    //以下是初始化store数组
    store=(int**)malloc(sizeof(int*)*(m+1));
    for(i=0;i<=m;i++)
        store[i]=(int*)malloc(sizeof(int)*(n+1));
    for(i=0;i<=m;i++)
        for(j=0;j<=n;j++)
            store[i][j]=-1;
    //以下是初始化a数组,存储price和对应value
    a=(node*)malloc(sizeof(node)*(m+1));
    for(i=1;i<=m;i++)
        scanf("%d %d",&a[i].price,&a[i].value);
    //以下是计算结果并输出
    res=calc(1,n);
    printf("%d",res);
    
    //
    for(i=0;i<=m;i++) free(store[i]);
    free(store);
    free(a);
    return 0;
}


点赞(0)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论