摘要:这道题让我纠结了很久,原来的思想是对的却又找出了理由否定自己,折腾半天还是相信第一感觉的好。首先找出最大的价格mx,然后让其它的做0/1背包,让其总和逼近dp[m-5],这应该很好理解,最后能买到的最多食物就是dp[m-5]+mx,所以余额为m-dp[m-5]-mx;不过还要判断m<5的情况就是买不到(题意规定)。代码:#include<iostream>
#include<algorithm>
using namespace std;
int a[1005],dp[1005];
int main()
{ int n,m,mx,i,j,pt; while( sca
阅读全文
摘要:一个多重背包的问题,如果还不了解多重背包,建议看背包九讲http://love-oriented.com/pack/#sec5,当然要深刻理解0/1背包和完全背包之后看多重背包就很简单。代码:#include<iostream>
using namespace std;
int dp[105],v,n[105],vl[105],ct[105];
void ZeroOnePack(int cost,int value)
{ for(int i=v; i>=cost; i--) dp[i]=max(dp[i],dp[i-cost]+value);
}
void Com...
阅读全文
摘要:今天做的两道DP和我以前做的不同,以前没试过换个变量来当作背包的容量,前面一道题奠定了这题的基础,这道题一看见的时候就知道用支票的个数来当容量,这道题有点题意不清,没看discuss的时候我也把题意理解错了,它说单项物品不超过600元其实是此类物品不超过600元,这道题也不能完全按照Robberies来做,这里有金额q的限制.转移方程为d[i]=max(d[j])+p[i]; 1=<j<i;代码:#include<iostream>
#include<cmath>
using namespace std;
double dp[35],p[35];
int m
阅读全文
摘要:一看题目的时候知道是0/1背包,就是不知道怎么入手,因为我们做的0/1背包是整数,如果用被抓率当容量的话要化成整数,根本无法做。也想过用银行金额来做容量,但是没想到用逃脱率当价值。纠结啊!这里涉及一个概率论的问题,如果用被抓率来算是加法,用逃脱率来说是乘法,因为总的被抓率等于每一次被抓率的总和(或的关系|只要有一次被抓就失败了)。逃脱率的话等于每一次逃脱率的乘积(且的关系|保证每次逃脱才算成功)。懂了这些0/1背包就没有压力了。代码:#include<iostream>
#include<cmath>
using namespace std;
int b[105];
d
阅读全文