zoukankan      html  css  js  c++  java
  • 洛谷 P4141 消失之物(dp方案数)

    传送门


    解题思路

    用dp[i][j]表示没有消失时前i个物品组成装满容积为j的背包的方案数。
    很显然,

    [dp[i][j]+=dp[i-1][j-w[i]] ]

    仿照背包,i这一维可以省去,j要逆序。

    然后再设f[i][j]表示去掉第i个物品时装满容积为j的方案数。
    那么在dp中减去用到i这个物品的方案数即可。

    [f[i][j]=dp[n][j]-f[i][j-w[i]] ]

    注意这时去掉第一维后,j还是要正序枚举。

    AC代码

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<vector>
    #include<map>
    #include<queue>
    #include<cmath>
    #include<stack>
    #include<set>
    #include<bitset>
    #include<cstdio>
    #include<ctime>
    using namespace std;
    inline int read()
    {
    	int f=0;
    	char cc=getchar();
    	while(cc<'0'||cc>'9')cc=getchar();
    	while(cc>='0'&&cc<='9')f=f*10+cc-'0',cc=getchar();
    	return f;
    }
    int n,m,w[2005],dp[2005],f[2005];
    int main(){
    	n=read();
    	m=read();
    	for(int i=1;i<=n;i++) w[i]=read();
    	dp[0]=1;
    	for(int i=1;i<=n;i++){
    		for(int j=m;j>=w[i];j--){
    			dp[j]+=dp[j-w[i]];
    			dp[j]%=10;
    		}
    	}
    	for(int i=1;i<=n;i++){
    		f[0]=1;
    		for(int j=1;j<=m;j++){
    			if(j>=w[i]) f[j]=dp[j]-f[j-w[i]];
    			else f[j]=dp[j];
    			f[j]=(f[j]%10+10)%10;
    			printf("%d",f[j]);
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    bzoj1218 本来dp 但是数据弱 枚举可过
    bzoj1816二分答案 扑克牌
    bzoj2748 水dp
    最长上升子序列(nlog n)
    bzoj1798线段树。。调的要死
    HTML5 移动开发 (HTML5标签和属性)
    关于全屏布局
    关于z-index这个层级的问题
    面板数据模型
    竞争模型
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/15061323.html
Copyright © 2011-2022 走看看