P2347 砝碼稱重 (01背包)
阿新 • • 發佈:2018-08-11
格式 sub base col can span %d spa 輸出
題目描述
設有 1g1g1g 、 2g2g2g 、 3g3g3g 、 5g5g5g 、 10g10g10g 、 20g20g20g 的砝碼各若幹枚(其總重 ≤1000 \le 1000≤1000 ),
輸入輸出格式
輸入格式:
輸入方式: a1,a2,a3,a4,a5,a6a_1 , a_2 ,a_3 , a_4 , a_5 ,a_6a1?,a2?,a3?,a4?,a5?,a6?
(表示 1g1g1g 砝碼有 a1a_1a1? 個, 2g2g2g 砝碼有 a2a_2a2? 個,…, 20g20g20g 砝碼有 a6a_6a6? 個)
輸出格式:
輸出方式: Total=NTotal=NTotal=N
( NNN 表示用這些砝碼能稱出的不同重量的個數,但不包括一個砝碼也不用的情況)
輸入輸出樣例
輸入樣例#1: 復制1 1 0 0 0 0輸出樣例Total=3
其實題目中有 “其總重 ≤1000”,這句提示了怎樣做的。
題目是,有n個m克的砝碼問可以稱量多少個重量。其實就是一個方案背包。我們利用了,當背包中有方案數時,就可以說明這些砝碼可以表示這個重量,
而方案數不是我們關心的。那麽,當有方案數時,就ans++.
當,將n個m克砝碼看做,n個重量為m的物品,這樣不就轉化為01方案背包了嘛。背包總量為所有和sum。
ac代碼如下:
#include<cstdio> #define MAXN int(1e6+10) int dp[MAXN]; int w[MAXN]; inta[] = { 0,1,2,3,5,10,20 }; int main() { int n = 0, k; for (int i = 1; i <= 6;++i) { scanf("%d", &k); for (int j = 1; j <= k; ++j) w[++n] = a[i]; } int v = 0; for (int i = 1; i <= n; ++i) v += w[i]; dp[0] = 1; for (int i = 1; i <= n;++i)for (int j = v; j >= w[i]; --j) dp[j] += dp[j - w[i]]; int ans = 0; for (int i = 1; i <= v;++i) if (dp[i])++ans; printf("Total=%d\n", ans); }
P2347 砝碼稱重 (01背包)