| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 853 人关注过本帖
标题:问一个多重背包问题
取消只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏
已结贴  问题点数:50 回复次数:8 
问一个多重背包问题
问题描述:
    某天,ZCL在街上闲逛,他在超市里看到促销广告:商品大降价。于是他很高兴地拿者篮子购物去了。已知商场内有n种商品,每种商品的重量为W千克,价格为V,价值为T。此种商品有H件。
    注意:此商场有一个奇怪的规定。每种物品要么不买,要么买1件或H件。ZCL带了Y元。ZCL最多能扛X千克的物品。请帮ZCL计算他最多能获得的价值。
   
输入格式
    第一行是3个整数n,x,y。
    接下来的n行,每行有4个数据,分别为W,V,T和H。
   
输出格式
    仅1行,1个整数表示Ztc最多能获得的价值。
   
样例输入输出:
shop.in
2 8 10
5 3 7 1
3 7 10 1

shop.out
17

我的思路是将H件物品拓展,例如,有一种物品价值为X,一共有H件,那么就先判断H是不是等于一,如果不等于,那么就拓展H*X的物品
搜索更多相关主题的帖子: 背包 
2010-11-14 09:02
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
哦?我发一个01的DP问题的代码:
#include<stdio.h>
#include<stdlib.h>
FILE *fin,*fout;
void file_start()
{
    if((fin=fopen("medic.in","r"))==NULL)
    {
        printf("Cannot open this file!\n");
        getchar();
        exit(0);
    }
    if((fout=fopen("medic.out","w"))==NULL)
    {
        printf("Cannot open this file!\n");
        getchar();
        exit(0);
    }
}
void main()
{
    int n,m,dp[30000]={0},v[30000],w[30000],i,j,sum;
    file_start();
    fscanf(fin,"%d %d",&n,&m);
    for(i=0;i<m;i++)
    fscanf(fin,"%d%d",&v[i],&w[i]);
    for(i=0;i<m;i++)
    {
    for(j=n;j>=v[i];j--)
    if(dp[j-v[i]]+w[i]>dp[j])
    dp[j]=dp[j-v[i]]+w[i];
    }
    sum=dp[n];
    fprintf(fout,"%d\n",sum);
    system("pause");
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-14 10:44
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
这是NOIP2005普及组的第三题,用DP做的

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-14 10:45
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
这个题的测试数据不是很大,改一下就OK了。

你改一下,我看看

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-14 11:32
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
晕,还是不懂
#include<stdio.h>
#include<stdlib.h>
FILE *fin,*fout;
void file_start()
{
    if((fin=fopen("transport.in","r"))==NULL)
    {
        printf("Cannot open this file!\n");
        getchar();
        exit(0);
    }
    if((fout=fopen("transport.out","w"))==NULL)
    {
        printf("Cannot open this file!\n");
        getchar();
        exit(0);
    }
}
void main()
{
    int weight,volume,n,i,j,sum;
    int dp[30000]={0},v[30000],w[30000],t[30000];//v为火力值,t为体积,w为重量
    file_start();//文件初始化
    fscanf(fin,"%d %d",&weight,&volume);//输入最大重量和体积
    fscanf(fin,"%d",&n);//输入一共有N件武器
    for(i=0;i<n;i++)
    fscanf(fin,"%d %d %d",&v[i],&t[i],&w[i]);//输入火力值,体积值,重量值
    for(i=0;i<n;i++)
    {
    for(j=n;j>=v[i];j--)
    if(dp[j-v[i]]+w[i]>dp[j])
    dp[j]=dp[j-v[i]]+w[i];
    }
    sum=dp[n];
    fprintf(fout,"%d\n",sum);
    system("pause");
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-14 11:56
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.013157 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved