思路:把重物从小到大排序,计算出每2个相邻的重物产生的疲劳度,放在p[i]数组中,表示i与i+1这2个重物产生的疲劳度。dp[i][j]表示进行到第i个物品(i前面的物品不一定都选了,跟背包差不多,i表示进行到第i个物品),已经选了j对物品 产生的最小疲劳度。初始化:先把所有值赋值为INF(无穷大),然后dp[i][0]=0;(0<=i<=n)因为没选重物之前疲劳度为0; for(i=0;i<=n;i++) for(j=0;j<=k;j++) dp[i][j]=INF; for(i=0;i<=n;i++)dp[i][0]=...    Read More
posted @ 2012-08-08 21:16
To be an ACMan
Views(180)
Comments(0)
Diggs(0)
        
            
        
        
        
dp[i][j]记录疲劳度用了i,杀了j个怪所获得的最大经验。View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int dp[103][103];int w[103],p[103];int main(){ int n, m, k, s, i, j, x; while(~scanf("%d%d%d%d",&n,&m,&k,&s)) { for(i=1;i<=k;i++) scanf(&q    Read More
posted @ 2012-08-08 20:45
To be an ACMan
Views(158)
Comments(0)
Diggs(0)
        
            
        
        
        
用dp[j]记录用j块钱最小不录取的概率。初始化dp[]都为1.0,因为没有选录取的概率为0,不录取的概率为1;View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int w[10001];double p[10001],q[10001],dp[10001];int main(){ int m, n, i, j; while(~scanf("%d%d",&m,&n)&&(n||m)) { fo    Read More
posted @ 2012-08-08 20:07
To be an ACMan
Views(154)
Comments(0)
Diggs(0)
        
            
        
        
        
中文题,题意自己看。思路:1.如果一开始钱少于5元,不买东西,按原值输出;2.否则,先拿这五块钱买最贵的一份菜(输入菜的价格后用sort排序一下),然后对其它n-1个菜进行0-1背包处理View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;bool dp[1001];int a[1001];int main(){ int i, j, n, m; while(~scanf("%d",&n)&&n) { f    Read More
posted @ 2012-08-08 20:02
To be an ACMan
Views(230)
Comments(0)
Diggs(0)
        
            
        
        
        
不解释View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;bool dp[10003];int main(){ int cas, m,a[4]={0,150,200,350}; int i, j; scanf("%d",&cas); while(cas--) { scanf("%d",&m); memset(dp,0,sizeof(dp)); dp[0]=1; for(i=1;i<=    Read More
posted @ 2012-08-08 19:57
To be an ACMan
Views(146)
Comments(0)
Diggs(0)
        
            
        
        
        
完全背包这里要装满,所以要注意dp初始化:dp[0]=0;当求背包最小值时dp[i]=INF(无穷大) (1<=i<=n);反之 dp[i]= -INF(无穷小) (1<=i<=n);View Code #include<stdio.h>#include<string.h>#include<algorithm>#define INF 1000000000using namespace std;int dp[10003],p[503],w[503];int main(){ int cas,i ,j, m, n, x, y; scanf(    Read More
posted @ 2012-08-08 19:54
To be an ACMan
Views(204)
Comments(0)
Diggs(0)
        
            
        
        
        
一些二进制的基本知识:判断j是否属于集合i:i&(1<<j)在集合i中去除j:i-(1<<j)或者i&(!(1<<j)) i^(1<<j)在集合i中加入点j:i|(1<<j);先预处理出len[i][j]表示第i个字符串与第j个字符串组合能匹配的最大字符数用一个数的二进制来表示那些字符串,那些字符串还没有选,即二进制位为1 的表示已经选了,为0的表示还没有选Dp[i][j]代表当选取的字符串为i状态,且最后一个选取的字符串是第j个字符串时的最优值状态转移:枚举某个状态时,枚举一个已选的字符串(即当前状态二进制位为1的位    Read More
posted @ 2012-08-08 19:04
To be an ACMan
Views(697)
Comments(2)
Diggs(0)
        
                    
                
浙公网安备 33010602011771号