| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 853 人关注过本帖
标题:问一个多重背包问题
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏
已结贴  问题点数:50 回复次数:13 
问一个多重背包问题
问题描述:
    某天,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
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:50 
这和普通背包不同的地方只是DP的时候,除了计算+W,还循环计算到+ n * W,那结束条件是n*W > X或者n>H

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-11-14 09:32
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
如果你按>>有一种物品价值为W,一共有H件
这样做会严重超时

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-11-14 09:33
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
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
for(j=n;j>=v[i];j--)
    if(dp[j-v[i]]+w[i]>dp[j])
就是改这两行

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-11-14 10:52
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
这里的修改,有改成O(n^2)递推和O(n)递推两种,而O(n^2)就是最暴力的,也就是整体O(n^3)很可能超时的版本
而O(n)的办法,是在这部分递归里,再做一层DP优化
收到的鲜花
  • wujieru2010-11-14 11:39 送鲜花  -3朵   附言:内容不符
  • sunyh19992010-11-14 11:56 送鲜花  49朵  
  • wujieru2010-11-14 12:00 送鲜花  -3朵   附言:过期内容

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-11-14 11:07
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
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
各种背包和相应的DP公式见
http://

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-11-14 20:30
快速回复:问一个多重背包问题
数据加载中...
 
   



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

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