n種砝碼,每種砝碼重ai,有bi個,問你最小不能稱的重量是多大?最大不超過8500.
範圍:(a<100,b<100)
揹包題,有數量限制,那麼就是多重揹包,就是看揹包能不能裝滿,以下兩種dp方式求解01揹包。
1.dp[i]表示容量為i的包能不能裝滿,能的話dp[i]=1。
2.dp[i]表示容量為i的包能裝的最大價值,其中每個砝碼的價值等於重量本身,
最後從1開始往上累加,找到第乙個dp為0的,這個就是最小的不能稱出的重量。
解法1:
#includeusing namespace std;
#define ll long long
const int maxn = 1e4 + 5;
int dp[maxn], s; //dp[i]表示容量為i的包能否裝滿, s是最大容量
void bag1(int w)
void bag3(int w, int num)
bag1(w * num);
}int weight[maxn], num[maxn]; //weight表示砝碼重量,num表示砝碼數量
int main()
for(int i = 1; i <= n; i ++)
int id = 1;
while(dp[id]) id ++; //dp[id]==1說明裝滿了
printf("%d\n", id);
}return 0;
}
解法2:
#includeusing namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int dp[maxn], s; //dp[i]表示容量為i的包能獲得最大價值,s是最大容量
void bag1(int w, int v)
void bag3(int w, int v, int num)
bag1(w * num, v * num);
}int weight[maxn], num[maxn];
int main()
for(int i = 1; i <= n; i ++)
int id = 1;
while(dp[id] == id) id ++; //最大價值等於重量說明裝滿了
printf("%d\n", id);
}return 0;
}
ZCMU1711揹包(dfs入門題)
你有乙個神奇的揹包,他的容積是m 0第一行 n,m 第二行 n個數字 輸出方案數 3 40 20 20 20 先將一下題意吧 乙個固定容積的揹包,然後給你n個物品,他們各自都有自己的容積,用這些物品去裝揹包,乙個前提條件就是一定要將揹包裝滿,不裝滿肯定不行,裝滿一次計數一次,大概就是這個意思了。剛剛...
三種簡單揹包問題模板 01揹包 完全揹包 多重揹包
概念 給定n種物品的價值和重量,每種物品最多只能取一次。求出當揹包容量為m時能夠裝下的最大價值 一維的寫法,dp陣列代表的是當前狀態能夠放下的最大價值 for int i 0 i w i j dp j max dp j dp j w i v i 對於第i件物品,可以放或不放。不放 dp j dp j...
hdu1171 多重揹包模板題
最近重新開始學dp,今天做到多重揹包這題,自己寫了乙個 感覺自己確實進步點了 嘻嘻。但是我沒看清題意n 0 退出迴圈,我wa 了無數次。下 面是自己寫的 include include include include include include include include include i...