资讯详情

【题解-Acwing】11. 背包问题求方案数

📅 2026/10/5 6:31:12 | 华诺云谱 👁 阅读
【题解-Acwing】11. 背包问题求方案数
题目11. 背包问题求方案数题目描述有N NN件物品和一个容量是V VV的背包。每件物品只能使用一次。第i ii件物品的体积是v i v_ivi​价值是w i w_iwi​。求解将哪些物品装入背包可使这些物品的总体积不超过背包容量且总价值最大。输出 最优选法的方案数。注意答案可能很大请输出答案模10 9 7 10^971097的结果。输入格式第一行两个整数N NNV VV用空格隔开分别表示物品数量和背包容积。接下来有N NN行每行两个整数v i v_ivi​,w i w_iwi​用空格隔开分别表示第i ii件物品的体积和价值。输出格式输出一个整数表示 方案数 模10 9 7 10^971097的结果。数据范围0 N , V ≤ 1000 0N,V≤10000N,V≤10000 v i , w i ≤ 1000 0v_i,w_i≤10000vi​,wi​≤1000时空限制1s / 64MB输入样例4 5 1 2 2 4 3 4 4 6输出样例2代码1二维数组#includeiostreamusingnamespacestd;constintMaxN100010,MaxV100010,mod1e97;intN,V,v[MaxN],w[MaxN],f[MaxN][MaxV],g[MaxN][MaxV];intmain(){cinNV;for(inti1;iN;i){cinv[i]w[i];for(intj0;jV;j){f[i][j]f[i-1][j];if(v[i]j){f[i][j]max(f[i][j],f[i-1][j-v[i]]w[i]);}}}g[0][0]1;for(inti1;iN;i){for(intj0;jV;j){if(f[i][j]f[i-1][j]){g[i][j](g[i][j]g[i-1][j])%mod;}if(jv[i]f[i][j]f[i-1][j-v[i]]w[i]){g[i][j](g[i][j]g[i-1][j-v[i]])%mod;}}}intres0;for(intj0;jV;j){if(f[N][j]f[N][V]){res(resg[N][j])%mod;}}coutres;return0;}代码2一维数组#includeiostream#includecstringusingnamespacestd;constintMaxV100010,mod1e97;intN,V,f[MaxV],g[MaxV];intmain(){cinNV;g[0]1;for(inti1;iN;i){intv,w;cinvw;for(intjV;jv;j--){intmaxwmax(f[j],f[j-v]w);intans0;if(maxwf[j]){ansg[j];}if(maxwf[j-v]w){ansg[j-v];}g[j]ans%mod;f[j]maxw;}}intmaxw0;for(intj0;jV;j){maxwmax(maxw,f[j]);}intres0;for(intj0;jV;j){if(maxwf[j]){res(resg[j])%mod;}}coutres;return0;}代码3一维数组#includebits/stdc.husingnamespacestd;constintN100010,MOD1e97;intn,V,v[N],w[N],f[N],g[N],ans;intmain(){cinnV;for(inti1;in;i)cinv[i]w[i];memset(f,-0x3f,sizeoff);f[0]0;g[0]1;for(inti1;in;i)for(intjV;jv[i];j--){intmaxxmax(f[j],f[j-v[i]]w[i]);intcnt0;if(maxxf[j])cntg[j];if(maxxf[j-v[i]]w[i])cntg[j-v[i]];f[j]maxx;g[j]cnt%MOD;ansmax(ans,f[j]);}intcnt0;for(intjV;j0;j--)if(f[j]ans)cnt(cntg[j])%MOD;coutcnt;return0;}结果
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑