SDUT3303 来发背包开开胃(模拟背包) ,DFS

来发背包开开胃

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

现有n种商品,每种商品有Si件,每种商品的价格和质量分别为Pi和Mi。你现在有钱V,问能购买的商品的总质量最大为多少。

输入

多组输入。 对于每组输入:

第一行两个整数n,V(1 <= n <= 3,1 <= V <= 1,000,000,000)。

接下来的n行,每行三个整数Si,Pi,Mi,分别代表第i种物品的数量,价格与质量(1 <= Si <= 100,1 <= Pi <= 1,000,000,000 , 1 <= Mi <= 1,000,000,000)。

输出

对于每组数据,输出一个整数代表答案。

示例输入

1 1010 1 10

示例输出

100

提示

此题数太大,不能用背包dp[10000000...],就算用map,也会因为从0初始化化到10亿而超时;

但数量少,可暴力,可DFS..

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

int main()
{
	int n;
	long long v,sum=-1,ans,s[4],m[5],p[5];
	while(~scanf("%d%lld",&n,&v))
	{
		sum=-1;
		memset(s,0,sizeof(s));
		memset(p,0,sizeof(p));
		memset(m,0,sizeof(m));

		for(int i=0;i<n;i++)
			scanf("%lld%lld%lld",&s[i],&p[i],&m[i]);

		for(int i=0;i<=s[0];i++)       //暴力模拟背包
			for(int j=0;j<=s[1];j++)
				for(int k=0;k<=s[2];k++)
				{
					if(v<i*p[0]+j*p[1]+p[2]*k)
					 continue;
					ans=i*m[0]+j*m[1]+m[2]*k;
					if(sum<ans)
						sum=ans;
				}
			printf("%lld\n",sum);
	}
}
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;
long long int n,v;
long long sum=-1;
long long int m[1000],p[1000],s[1000];
int vis[5],tt=0;
int DFS(int i,long long int v,long long int ans,int num)
{
    if(v<0)
        return 0;
    if(i>n)        //种类
        return 0;
    if(num>tt)     //个数不能超过总个数
        return 0;
    if(ans>sum)
    {
        sum=ans;
        return 0;
    }
    for(int j=0; j<=s[i]; j++)
    {
        if(v-p[i]*j>=0)
        {
            DFS(i+1,v-p[i]*j,ans+m[i]*j,num+j);

        }
    }
}
int main()
{
    while(~scanf("%lld%lld",&n,&v))
    {
        tt=0;
        for(int i=0; i<n; i++)
        {
            scanf("%lld%lld%lld",&s[i],&p[i],&m[i]);
            tt+=s[i];
        }
        memset(vis,0,sizeof(vis));
        sum=0;
        DFS(0,v,0,0);
        printf("%lld\n",sum);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-13 17:15:51

SDUT3303 来发背包开开胃(模拟背包) ,DFS的相关文章

hdoj 1203 I NEED A OFFER! 【另类01背包】【概率背包】

题意:... 策略:动态规划. 因为是求至少能得到一个offer的概率,那我们可以反着求,求得不到一个offer的概率,最后用1减去就好了. 代码: #include<string.h> #include<stdio.h> double dp[10010]; struct node{ int a; double b; }s[10010]; int main() { int n, m, i, j; while(scanf("%d%d", &n, &

nyoj 860 又见01背包 【另类01背包】

分析: 首先这道题不能当做普通的01背包问题,因为W <= 10^9,开不了,那么大的数组,肯定有其他的思路,观察一下我们知道价值v小的很,最大100, 那我们就可以利用这一点,拿价值 之和作为原来的质量之和, 但是有一点要注意:因为题意是要在质量不超过W的范围内,找出最大的价值,我们现在是以最大的价值求质量,那么仔细分析一下,我们就能想明白,要以某价值i的背包存放尽量小的质量,这样反过来分析一下就可以知道,较小的质量有个较大的价值序号,这样完全满足题意了, 最后还有一点,就是价值背包的每一个(

多重背包转换成完全背包和01背包

void CompletePack(int cost,int weight)   多重背包 { for(int i=cost;i<=m;i++) dp[i]=max(dp[i],dp[i-cost]+weight); } void ZeroOnePack(int cost,int weight)    01背包 { for(int i=m;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+weight); } void MultiplyPack(int cost,

01背包模板、全然背包 and 多重背包(模板)

转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html 模版就直接贴代码: 01背包模板: /* 01背包问题 01背包问题的特点是,">每种物品仅有一件.能够选择放或不放. 01背包问题描写叙述: 有N件物品和一个容量为V的背包. 第i件物品的重量是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品

iPhone5S进水烧主板了板子发烫开不起机怎么办iPhone5S进水怎么办主板会发霉腐蚀吗开不开机了维修(推荐维修)

北京飞维智能科技有限公司是一家专业从事Ipad.Macbook.Macbook-Pro. Macbook-Air. Ibook. powerbook. G4 .G5.Mac-Mini iMAC 一体机. EMAC Ipod Touch播放器 Iphone手机 等专业综合服务公司.公司凭借着一流的维修技术,领先的IT外包服务专业的维修经验和良好的客户口碑,现已成为北京中关村及周边城市知名笔记本电脑维护.IT服务.苹果维修等服务商之一,成为广大笔记本用户和众多苹果用户密切的合作伙伴.为他们提供了强有

iPhone5S进水烧主板了板子发烫开不起机怎么办(推荐维修)

北京飞维科技有限公司是一家专业从事Ipad.Macbook.Macbook-Pro. Macbook-Air. Ibook. powerbook. G4 .G5.Mac-Mini iMAC 一体机. EMAC Ipod Touch播放器 Iphone手机 等专业综合服务公司.公司凭借着一流的维修技术,领先的IT外包服务专业的维修经验和良好的客户口碑,现已成为北京中关村及周边城市知名笔记本电脑维护.IT服务.苹果维修等服务商之一,成为广大笔记本用户和众多苹果用户密切的合作伙伴.为他们提供了强有力的

nyoj 311-完全背包 (动态规划, 完全背包)

311-完全背包 内存限制:64MB 时间限制:4000ms Special Judge: No accepted:5 submit:7 题目描述: 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是w.求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大.本题要求是背包恰好装满背包时,求出最大价值总和是多少.如果不能恰好装满背包,输出NO 输入描述: 第一行: N 表示有多少组测试数据(N<7). 接下来每组测试数

UVALive 6257 Chemist&#39;s vows --一道题的三种解法(模拟,DFS,DP)

题意:给一个元素周期表的元素符号(114种),再给一个串,问这个串能否有这些元素符号组成(全为小写). 解法1:动态规划 定义:dp[i]表示到 i 这个字符为止,能否有元素周期表里的符号构成. 则有转移方程:dp[i] = (dp[i-1]&&f(i-1,1)) || (dp[i-2]&&f(i-2,2))     f(i,k):表示从i开始填入k个字符,这k个字符在不在元素周期表中.  dp[0] = 1 代码: //109ms 0KB #include <ios

hdu--1712--分组背包&lt;如果你真的明白了背包..&gt;

真的是蛮好的一题~ 里面的第二层循环 小变量 i j k分别从哪里开始 哪里结束 逆序 还是 顺序 都要好好地去体会 我自己讲不来  至于为什么V是逆序 你可以将它当成某种特殊的01背包来看待 就很容易想了 其实 第3层循环 1 for( int k = 1 ; k<=m ; k++ ) 2 { 3 if( j>=k ) 4 { 5 dp[j] = max( dp[j] , dp[j-k]+a[i][k-1] ); 6 } 7 } 这里的 if( j>=k )因为是K就代表了天数 这是很