南阳OJ 背包问题

??

/*背包问题

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

描写叙述 如今有非常多物品(它们是能够切割的),我们知道它们每一个物品的单位重量的价值v和

重量w(1<=v,w<=10);假设给你一个背包它能容纳的重量为m(10<=m<=20),

你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。

输入第一行输入一个正整数n(1<=n<=5),表示有n组測试数据;

随后有n測试数据。每组測试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。

接下来的s行每行有两个正整数v,w。

输出输出每组測试数据中背包内的物品的价值和,每次输出占一行。

例子输入1

3 15

5 10

2 8

3 9

例子输出65*/

<span style="font-size:18px;">#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct pack{
    int v;//单位价值
    int w;//重量
    int total; //总价值
}bao[10];
int cmp( const void *a ,const void *b){
    return (*(pack *)b).v - (*(pack *)a).v;//这是qsort函数。

}
int main(){
    int n,s,i,j;
    int vsum,wsum,m;
    scanf("%d",&n);
    while(n--){// 測试组数
        memset(bao,0,sizeof(bao));  //不要忘记每次循环都要初始化数组!

!。
        scanf("%d%d",&s,&m);// 物品数量,背包最大载重
        for(i=0;i<s;i++){
            scanf("%d%d",&bao[i].v,&bao[i].w);
            bao[i].total=bao[i].w*bao[i].v;
        }//计算每一个物品总价值
        qsort(bao,10,sizeof(bao[0]),cmp);  

        wsum=0;  vsum=0;
        for(i=0;i<s;i++){
            if(m>=(wsum+bao[i].w)){  //整放物品
                vsum+=bao[i].total;
                wsum+=bao[i].w;
            }
            else if(m<(wsum+bao[i].w)&&m>=wsum){  //假设不能整放物品,就切割开放
                vsum+=(m-wsum)*bao[i].v;
                break;
            }
        }
        printf("%d\n",vsum);
    }
    return 0;
}
</span>
时间: 2024-12-06 02:21:05

南阳OJ 背包问题的相关文章

【南阳OJ分类之语言入门】80题题目+AC代码汇总

声明: 题目部分皆为南阳OJ题目. 代码部分包含AC代码(可能不止一个)和最优代码,大部分都是本人写的,并且大部分为c代码和少部分c++代码and极少java代码,但基本都是c语言知识点,没有太多差别,可能代码有的写的比较丑,毕竟知识有限. 语言入门部分题基本都较为简单,是学习编程入门的很好练习,也是ACM的第一步,入门的最佳方法,望认真对待. 本文由csdn-jtahstu原创,转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:1373758426和csdn博客地址. now begi

【南阳OJ分类之大数问题】题目+AC代码汇总

声明:题目部分皆为南阳OJ题目,代码部分包含AC代码(可能不止一个)和标程. 由于大数问题用c/c++写比较麻烦,而Java的大数类又很好用,所以基本为java代码.实际上竞赛很少会考大数问题,因为竞赛是比的算法,而不是语言特性,不过很多都是大数据,数据上千万级别的,所以算法又很关键,显然那和这篇博客也没啥关系. 题目不是太难,大家和本人就权当学习或复习下Java吧O(∩_∩)O~. 该分类南阳oj地址:http://acm.nyist.edu.cn/JudgeOnline/problemset

南阳OJ 61 传纸条(一)

传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者

hdoj Pipe&amp;&amp;南阳oj管道问题&amp;&amp;poj1039(计算几何问题...枚举)

Pipe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 240    Accepted Submission(s): 99 Problem Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic l

南阳 oj 重建二叉树 题目756

 #include <stdio.h> #include <malloc.h> #include <string.h> //二叉链表 typedef struct node{ char data;//节点数据元素 struct node *lchild;//指向左孩子 struct node *rchild;//指向右孩子 }BiNode,*BTree; //利用后序和中序建立二叉树 void GetPreOrder(char *last,char *mid,BTr

拦截导弹(南阳oj)(dp最长下降子序列)

拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度.某天,雷达捕捉到敌国导弹来袭.由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹. 输入 第一行输入测试数据组数N(1<=N<=10) 接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20) 接下来行输

南阳OJ 16 矩形嵌套

描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数, 每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=10

南阳 oj 郁闷的c小加(三) 题目409

/* 表达式树思路 (a+b)*(c*(d+e); 对该树进行后序遍历得到后缀表达式 ab+cde+**; 这里实现的是如何根据一个后缀表达式,构造出其相应的表达式树. 算法思想:其实很简单,主要就是栈的使用.算法时间复杂度是O(n),n是后缀表达式长度. 从前向后依次扫描后缀表达式,如果是操作数就建立一个单节点树,并把其指针压入栈.如果是操作符,则 建立一个以该操作符为根的树,然后从栈中依次弹出两个指针(这2个指针分别指向2个树),作为该树的 左右子树.然后把指向这棵树的指针压入栈.直到扫描完

Box of Bricks(南阳oj)

Box of Bricks 时间限制:1000 ms  |  内存限制:65535 KB 描述 Bob在垒砖块,但是他垒的有些乱,但是他很懒,所以想花费最少的体力来让他垒好的砖块一样高,所以你需要做的就是算出最少需要移动的砖块 输入 多组测试数据,以EOF结束,第一行是一个n(1<=n<=50)表示有n摞砖 第二行是n个正整数k(1<=k<=100)表示每摞砖的砖块数量 输出 对于每组输入数据有两行输出,第一行是一个Case #x,表示x组测试数据,第二行是一句话The minim