lightoj1200 【完全背包】
题意: 
有一个能放W重的袋子,然后妻子给了老公一列清单,每个item会有价格,数量,重量。 
首先得满足老婆的要求,然后在可装的地方输出最大还能拿多少使得拿的东西的钱最多。 
注意标题是thief,我想大家也能知道基本上出背包题的人都是心机biao啊…)逃 
思路: 
1.首先要满足wife的要求是不是。 
2.其次再满足husband的小心思。 
后面就转化成了完全背包。
一开始类似0/1背包直接那个超时转化交了一发,肯定T。。 
)然后贴了一发完全背包模板就过了。。。
——然后去看了百度百科的完全背包(没错就是百度百科),摘了几句下来
完全背包与01背包的伪代码只有v的循环次序不同而已。为什么这样一改就可行呢?
因为要保证第i次循环中的状态dp[ j ]是由状态dp[ j-w[ i ] ]递推而来。 
换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个没有已经选入第i件物品的子结果dp[ j - w[ i ] ]。 
比如当你在算dp[ j(>2*w[i]) ] 的时候,其实你的dp[j-w[i]]在前面已经更新了,所以采用一维数组直接可以办到,而且每次更新的复杂度是O(W),总的来说就是O(nW); 
这也是最优解法吧。 
不过百度百科上还有一个优化没怎么看懂。 
原文: 
更高效的转化方法是:把第i种物品拆成费用为c*2^k、价值为w*2^k的若干件物品,其中k满足0<=k<=log2(V/c)+1。这是二进制的思想,因为不管最优策略选几件第i种物品,总可以表示成若干个2^k件物品的和。这样把每种物品拆成O(log2(V/c))件物品,是一个很大的改进。 
wonter巨:因为一个数总能分成若干个2^i相加之和啊。 
也许这样可以若有所思~ 
code…
#include<bits/stdc++.h>
//#include<cstdio>
//#include<math.h>
//#include<string.h>
//#include<algorithm>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const double eps=1e-5;
const double pi=acos(-1.0);
const int mod=1e8+7;
const LL INF=0x3f3f3f3f;
const int N=1e2+10;
int val[N],dw[N];
int dp[N*N];
int main()
{
    int cas=1;
    int n,w;
    int t,x,sum;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&w);
        sum=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&val[i],&x,&dw[i]);
            sum+=x*dw[i];
        }
        w-=sum;
        if(w<0){
            printf("Case %d: Impossible\n",cas++);
            continue;
        }
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            for(int j=dw[i];j<=w;j++){
                dp[j]=max(dp[j],dp[j-dw[i]]+val[i]);
            }
        }
        printf("Case %d: %d\n",cas++,dp[w]);
    }
    return 0;
}
lightoj1200 【完全背包】的更多相关文章
- 【USACO 3.1】Stamps (完全背包)
		题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ... 
- HDU 3535 AreYouBusy (混合背包)
		题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ... 
- HDU2159 二维完全背包
		FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ... 
- CF2.D 并查集+背包
		D. Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit p ... 
- UVALive 4870 Roller Coaster  --01背包
		题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F , D -= K 问在D小于等于一定限度的时 ... 
- 洛谷P1782 旅行商的背包[多重背包]
		题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ... 
- POJ1717 Dominoes[背包DP]
		Dominoes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6731 Accepted: 2234 Descript ... 
- HDU3466 Proud Merchants[背包DP 条件限制]
		Proud Merchants Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) ... 
- POJ1112 Team Them Up![二分图染色 补图 01背包]
		Team Them Up! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7608 Accepted: 2041 S ... 
随机推荐
- require.js结合项目的使用心得
			1.首先引入require.js 2.配置config.js文件 var $cdn_url=/'''/''/;----->指定文件一个共用的路径 require.config({ baseUrl ... 
- 优化你的服务器Apache、MySQL、PHP
			硬件上的考虑其实起50%的作用,当然是越快越好.如果不知道哪个快,就换成越贵越好.可实际上不可能做到这些,因为银子有限,所以按照这个顺序考虑:内存越大越好->硬盘SCSI好于SATA->C ... 
- [转载]C函数的实现(strcpy,atoi,atof,itoa,reverse)
			在笔试面试中经常会遇到让你实现C语言中的一些函数比如strcpy,atoi等 1. atoi 把字符串s转换成数字 int Atoi( char *s ) { , i = ; ; ; isspace( ... 
- [LeetCode] 038. Count and Say (Easy) (C++/Python)
			索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 038. Cou ... 
- JRE、JDK、JVM区别和联系
			首先说Java编程语言,它是一门高级编程语言,具体由谁何时创建的,读者可以到网上查找相关资料,这里就不再赘述.那么,谈到Java就不得不谈谈JVM.JRE和JDK三者间的区别和联系. JVM:英文全称 ... 
- MongoDB安装和简单介绍
			前面我们把nodejs的web开发入门说了,如今来说说数据库,一般搭配的数据库是mysql和mongodb,今天我们来说mongodb MongoDB是一个基于分布式文件存储的数据库,由C++语言编写 ... 
- 有遍历struct中字段信息的函数或方法
			例:struct a{int a;char b[10];double c;}; 在程序中只知道一个结构 a 的指针, 有没有函数能通过结构的名字 和 指向结构的指针 随次得到 结构中的变量类型 和 变 ... 
- android 图片内存问题
			在android开发过程中,经常遇到oom的问题,原因有很多种,其中最难处理的是图片造成的oom,于是在网络上对比了几个图片加载的库,最终选择了Facebook的fresco库(github地址:ht ... 
- iOS的基本框架
- sed替换变量
			今天在写脚本时用到了sed,我用sed替换xml文件中的变量.一般在sed 中替换都用单引号,如下边 sed -i ‘s/10/1000/g’ test.xml但是如果需要把1000改成变量,如sed ... 
