/ Vijos / 题库 / 采药 /

题解

302 条题解

  • 0
    @ 2009-08-17 15:47:04

    #include

    using namespace std;

    int main(){

    int time=0,num=0,mtime[1001]={},mmoney[101]={},f[10001]={};

    cin>>time;//采药时间

    cin>>num;//草药的数目

    for(int i=1;i>mtime[i]>>mmoney[i];//分别表示采摘某株草药的时间和这株草药的价值。

    }

    for(int i=1;i=mtime[i];j--){//从最后时间开始列举

    if(f[j-mtime[i]]/*没有采药的时间的最大价值*/+mmoney[i]/*当前草药价值*/>f[j]/*采药后当前时间的最大价值*/){

    f[j]=f[j-mtime[i]]+mmoney[i];//记当前时间最大价值为 没有采药的时间的最大价值+当前草药价值

    }

    }

    }

    cout

  • 0
    @ 2009-08-16 20:01:56

    var i,m,n,x:integer;

    w:array[0..1000] of integer;

    c:array[0..100] of integer;

    f:array[0..10000] of integer;

    begin

    readln(m,n);

    fillchar(f,sizeof(f),0);

    for i:=1 to n do

    readln(w[i],c[i]);

    for i:=1 to n do

    for x:=m downto w[i] do

    if f[x-w[i]]+c[i]>f[x] then f[x]:=f[x-w[i]]+c[i];

    writeln(f[m]);

    end.

  • 0
    @ 2009-08-13 08:32:42

    就是01背包啊

  • 0
    @ 2009-08-12 23:33:34

    01背包水啊

    #include

    typedef struct {

    int v,jz;}node;

    typedef node st[200];

    st T;

    int f[1010]={0},m,t;

    void init()

    {

    int i;

    scanf("%d%d",&t,&m);

    for(i=1;if[j])

    f[j]=f[j-T[i].v]+T[i].jz;

    printf("%d",f[t]);

    }

    main()

    {

    init();

    work();

    return 0;

    }

  • 0
    @ 2009-08-12 23:01:52

    卧槽,直接把开心的今明改了改,结果v和w数组开的仍然是25,偏偏大晚上的眼花了

    就这么着害了我四次

    Orz.......

  • 0
    @ 2009-08-12 15:27:26

    郁闷!!少了 f:=f 害我交了3次哩!!

  • 0
    @ 2009-08-11 22:15:37

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    纪念50题-。- 。。

  • 0
    @ 2009-08-10 23:36:21

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    01背包。。。。。 f[j]:=max(f[j-a[i]]+b[i],f[j])

  • 0
    @ 2009-08-10 14:40:03

    写了一种奇怪的算法。。。。。。

    var t,m,lt,a:integer;

    st:array[1..100] of integer;

    sc:array[1..100] of integer;

    s:array[0..1000] of integer;

    isgot:array[0..1000,1..100] of boolean;

    function max(a,b:integer):integer;

    begin

    if a>b then exit(a)

    else exit(b);

    end;

    begin

    readln(t,m);

    for a:=1 to m do

    readln(st[a],sc[a]);

    for lt:=1 to t do

    for a:=1 to m do

    begin

    if st[a]

  • 0
    @ 2009-08-08 13:40:45

    又AC。。。

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var v,t:array[0..100] of integer;

    f:array[0..100,0..1000] of integer;

    i,j,m,n:integer;

    begin

    readln(m,n);

    for i:=1 to n do

    readln(t[i],v[i]);

    fillchar(f,sizeof(f),0);

    for i:=1 to n do

    for j:=1 to m do

    begin

    f:=f;

    if (j-t[i]>=0)and(f+v[i]>f) then

    f:=f+v[i];

    end;

    writeln(f[n,m]);

    End.

  • 0
    @ 2009-08-07 17:43:08

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    典型背包

  • 0
    @ 2009-08-05 11:11:05

    #include

    #define M 101

    int f[1001];

    int main()

    {

    int t,m,time[M],p[M],tmp;

    int i,j,k;

    scanf("%d %d",&t,&m);

    for(i = 1;i = 0 && f[tmp]+p[i] > f[j]) {

    f[j] = f[tmp] + p[i];

    }

    }

    }

    printf("%d",f[t]);

    return 0;

    }

    27JZY写的思路很清楚,建议看看。

  • 0
    @ 2009-08-05 09:18:42

    var v,t:array[0..100] of integer;

    f:array[0..100,0..1000] of integer;

    i,j,m,n:integer;

    begin

    readln(m,n);

    for i:=1 to n do

    readln(t[i],v[i]);

    fillchar(f,sizeof(f),0);

    for i:=1 to n do

    for j:=1 to m do

    begin

    f:=f;

    if (j-t[i]>=0)and(f+v[i]>f) then

    f:=f+v[i];

    end;

    writeln(f[n,m]);

    End.

    {本题明显为‘背包问题’,其中f二维数组中i记录草药编号,f记录

    当剩余时间为j时的最大价值}

  • 0
    @ 2009-08-03 07:03:59

    01背包为什么楼下各位大牛都用二维数组额。。特殊情况最多2个一维数组互相更新就可以了吧。

  • 0
    @ 2009-08-02 11:37:24

    var f:array[0..100,0..1000]of longint;

    yt,ym:array[1..100]of integer;

    i,j,k,n,m,t:longint;

    function max (a,b:longint):longint;

    begin

    if(a>b)then max:=a

    else max:=b;

    end;

    begin

    readln(t,m);

    for i:=1 to t do f[0,i]:=0;

    for i:=1 to m do f:=0;

    for i:=1 to m do read(yt[i],ym[i]);

    for i:=1 to m do begin

    for j:=1 to t do

    if(yt[i]

  • 0
    @ 2009-07-28 23:03:19

    经典背包,纪念50题

  • 0
    @ 2009-07-27 21:52:16

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    注意,可以仅拿一个数组做。

  • 0
    @ 2009-07-26 20:54:44

    背包

    动态规划里的水题

    f:=max(f,f[i-1,j-a]+a);

  • 0
    @ 2009-07-24 14:46:22

    program p1104;

    var

    a:array[1..100,1..3]of integer;

    i,j,t,m,x:integer;

    b:array[1..100]of integer;

    begin

    read(t,m);

    for i:=1 to m do

    a:=i;

    for i:=1 to m do

    for j:=1 to 2 do

    read(a);

    for i:=1 to (m-1) do

    for j:=i to m do

    if a

  • 0
    @ 2009-07-18 14:28:29

    const

    maxm=30000; maxn=25;

    type ar=array[1..maxn] of integer;

    var m,n,j,i:integer;

    c,w:ar;

    f:array[0..maxn,0..maxm] of longint;

    function max(x,y:integer):integer;

    begin

    if x>y then max:=x else max:=y;

    end;

    begin

    readln(m,n);

    for i:= 1 to n do

    readln(w[i],c[i]);

    for i:=1 to m do f[0,i]:=0;

    for i:=1 to n do f:=0;

    for i:=1 to n do

    for j:=1 to m do

    begin

    if j>=w[i] then f:=max(f+c[i],f)

    else f:=f;

    end;

    writeln(f[n,m]);

    end.

信息

ID
1104
难度
4
分类
动态规划 | 背包 点击显示
标签
递交数
16824
已通过
6527
通过率
39%
被复制
38
上传者