1. 程式人生 > >P2347 砝碼稱重 (01背包)

P2347 砝碼稱重 (01背包)

格式 sub base col can span %d spa 輸出

題目描述

設有 1g1g1g 、 2g2g2g 、 3g3g3g 、 5g5g5g 、 10g10g10g 、 20g20g20g 的砝碼各若幹枚(其總重 ≤1000 \le 10001000 ),

輸入輸出格式

輸入格式:

輸入方式: 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];
int
a[] = { 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背包)