你會發現
對於這種很像揹包的dp。。。不打滾動陣列很有可能錯,因為很多時候可能會忘記保留以前狀態的答案,體現在f[i][j] = max(f[i-1][j], f[i][j]);
上,因為f[i][j]可能被f[i][b[i]]更新,所以要取max,若想不取max,則必須保證這個狀態只會被更新一次
這題刷錶比填表更好寫,刷表你的初始化只需要讓f[0] = 1 然後用目前的0去更新其他狀態
#include
#include
#include
#include
#include
using
namespace
std;
#define debug(x) cerr << #x << "=" << x << endl;
const
int maxn = 2005;
const
int mod = 1000000000 + 7;
int n,ans,a[30],m,vis_c[30],vis_w[30],hshtemp[maxn],b[maxn],f[maxn],tot;
int calc()
}memset(f, 0, sizeof(f));
f[0] = 1;
tot = 0;
for(int i=1; i<=n; i++)
tot += a[i];
}/* for(int i=1; i<=now; i++)
}*/for(int i=1; i<=tot; i++)
if(f[i]) sum++;
return sum;
}void dfs_c(int x, int now, int m)
if(now > m || x >= n+1) return;
if(!vis_c[x])
dfs_c(x+1, now, m);
}int main()
dfs_c(1, 0, m);
printf("%d\n", ans);
return
0;}
洛谷P1441 砝碼稱重
現有n個砝碼,重量分別為 aia iai 在去掉 mmm 個砝碼後,問最多能稱量出多少不同的重量 不包括 000 請注意,砝碼只能放在其中一邊。第 111 行為有兩個整數 nnn 和 mmm,用空格分隔。第 222 行有 nnn 個正整數 a1,a2,a3,ana 1,a 2,a 3,ldots a...
P1441 砝碼稱重 搜尋 01揹包
現有n個砝碼,重量分別為 a iai 在去掉 mm 個砝碼後,問最多能稱量出多少不同的重量 不包括 00 請注意,砝碼只能放在其中一邊。第 11 行為有兩個整數 nn 和 mm,用空格分隔。第 22 行有 nn 個正整數 a 1,a 2,a 3,ldots a na1 a2 a3 an 表示每個砝碼...
洛谷 P1441 砝碼稱重(深搜 DP)
傳送門 題目描述 現有n個砝碼,重量分別為a1,a2,a3,an,在去掉m個砝碼後,問最多能稱量出多少不同的重量 不包括0 輸入輸出格式 輸入格式 輸入檔案weight.in的第1行為有兩個整數n和m,用空格分隔 第2行有n個正整數a1,a2,a3,an,表示每個砝碼的重量。輸出格式 輸出檔案wei...