設有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表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用的情況)
這道題類似於「小a點菜」那道題,都是01揹包求方案數
都是先將f[0]=1,然後f[j]+=f[j-c[i]]計算
即那麼如果選擇了呢,f[i][j]=f[i-c[i]];
為了減少空間浪費,去掉第一維,可以得到:最後再掃一遍記錄個數
#include#include#include
#include
#include
using
namespace
std;
#define maxn 100010
#define clear(a) memset(a,0,sizeof a)
#define ll long long
#define il inlineil
void read(int &x)
while(ch>='
0'&&ch<='
9')x *=f;
}int
tot, sum, ans;
int pre[7] = ;
int a[10
], f[maxn], val[maxn];
intmain()
f[0] = 1
;
for (int i = 1; i <= 6;i++)
for (int j = 1;j<=a[i];j++)
val[++tot] =pre[i];
for (int i = 1; i <= tot;i++)
for (int j = sum; j >= val[i];j--)
f[j] += f[j -val[i]];
for (int i = 1; i <= sum;i++)
if(f[i])
ans++;//
如果某一位為true說明可能出現這種情況
cout << "
total=
"
}
洛谷 P2347 砝碼稱重
時間限制1.00s 記憶體限制125.00mb 設有1g 2g 3g 5g 10g 20g的砝碼各若干枚 其總重 1000 輸入 1 1 1 0 0 0 0 輸出 1 total 3 方法一 sign j a i 1 思想類似於裝箱問題 include using namespace std con...
P2347 砝碼稱重
題目入口 p2347 砝碼稱重 寫在前面 本題是乙個簡單的 多重揹包 不用二進位制優化也毫無關係 甚至據說六個迴圈都能過 逃 如何記錄方案數 if dp i i ret 解釋來說就是dp當前重量有 最優 方案說明此重量可實現,那麼結果加一 使用模版 模版 揹包問題彙總 多重揹包模版 二進位制優化 i...
P2347 砝碼稱重
題目描述 設有1g 2g 3g 5g 10g 20g的砝碼各若干枚 其總重 1000 輸入格式 輸入方式 a1,a2,a3,a4,a5,a6 表示1g砝碼有a1個,2g砝碼有a2個,20g砝碼有a6個 輸出格式 輸出方式 total n n表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用...