| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 853 人关注过本帖
标题:问一个多重背包问题
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
不好意思,我上面的码问题是
【题目描述】

德国放松对英国的进攻后,把矛头指向了东边——苏联。

1943年初,东线的战斗进行到白热化阶段。据可靠情报,90余万德国军队在库尔斯克准备发动浩大攻势。因此,朱可夫大帅要求你立即从远东的军工厂运输大量的装备支援库尔斯克前线。

列车司机告诉你,一趟列车最多可以容纳V体积的武器装备,但是你可能不能装满,因为列车承受不了那么大的重量,一趟列车最多可以承受G的重量。同时,军工厂仓库提供给你一份装备清单,详细记录了每件装备的体积、重量和火力。为了支援朱可夫大帅,你要找到一种方案,使得总火力值最大。

【输入数据】

第一行:V和G表示最大重量和体积;

第二行:N表示装备数目。

第三行到N+2行:每行3个整数Ti Vi Gi 表示各个装备的火力值、体积和重量。

【输出数据】

输出一个数表示可能获得的最大火力值。

【样例输入】

6 5

4

10 2 2

20 3 2

40 4 3

30 3 3

【样例输出】

50

【数据范围】

V,G,N<=400.

【题解】

很简单

二维0/1背包

【标程】

program hgdjk;
var v,g,n,i,j,k,l,t:longint;
    a,b,c:array[1..400]of longint;
    f:array[0..400,0..400]of qword;
begin
assign(input,'transport.in');
reset(input);
assign(output,'transport.out');
rewrite(output);
readln(v,g);
readln(n);
for i:=1 to n do
    readln(a[i],b[i],c[i]);
fillchar(f,sizeof(f),0);
for i:=1 to n do
    for j:=v downto b[i] do
      for k:=g downto c[i] do
        if f[j,k]<f[j-b[i],k-c[i]]+a[i] then f[j,k]:=f[j-b[i],k-c[i]]+a[i];
writeln(f[v,g]);
close(input);
close(output);
end.

里面有pascal代码,但我看不懂    是不是也用DP的,你帮忙看看好吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-15 17:47
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
终于写好了,写的是完全背包,你有没有测试数据?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-16 17:55
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
求完全背包测试数据

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-16 17:56
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
我的代码:
#include <stdio.h>
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
int main(){
    int n,m,i,j,v[100]={0},w[100]={0},dp[30000]={0};
    scanf("%d %d",&m,&n);
    for (i=0;i<n;i++)
    scanf("%d %d",&w[i],&v[i]);
    for (i=0;i<n;i++)
        for (j=v[i];j<=m;j++)
        {
            dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
        }
    printf("%d",dp[m]);
    system("pause");
    return 0;
}

不知道对不对,请各位大虾指正

[ 本帖最后由 sunyh1999 于 2010-11-16 19:20 编辑 ]

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-16 18:45
快速回复:问一个多重背包问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017690 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved