简单的一道题 背包问题
生活随笔
收集整理的這篇文章主要介紹了
简单的一道题 背包问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡單的一道題
時間限制:?1 Sec??內存限制:?128 MB
題目描述
麻煩的渣渣輝又要和女朋友去旅游啦。
他們有一個最多能用V公斤的背包,現在有n件物品,它們的重量分別是W1,W2,...Wn,它們的價值分別為C1C2...Cn。
有的物品只可以取一次(01背包),有的物品可以取無限次(完全背包),有的物品可以取的次數有一個上限(多重背包)。
求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。
輸入
第一行:二個整數,V(背包容量,V<=200),N(物品數量,N<=30);
第2..N+1行:每行三個整數WiCiPi,前兩個整數分別表示每個物品的重量,價值,第三個整數若為0,
則說明此物品可以購買無數件,若為其他數字,則為此物品可購買的最多件數(Pi)。
輸出
僅一行,一個數,表示最大總價值。
樣例輸入
10 3 2 1 0 3 3 1 4 5 4樣例輸出
11 #include<iostream> #include<cstdio> using namespace std; const int maxn = 1005; int dp[maxn][maxn]; int c[maxn];//重量 int w[maxn];//價值 bool x[maxn];//若為1,則說明此物品可以購買無數件 int main() {int v,n;while(scanf("%d %d",&v,&n) != EOF){int p = 1;//物品個數int a,b,t;//重量,價值,個數for(int i = 1;i <= n; i++){scanf("%d %d %d",&a,&b,&t);if(t == 0){//無數件物品x[p] = true;c[p] = a;w[p] = b;p++;}else{x[p] = false;//t件相同的物品while(t--){c[p] = a,w[p] = b;p++;}//while}//else}//forp--;//初始化for(int i = 0;i < n; i++){dp[i][0] = dp[0][i] = 0;}for(int i = 1;i <= p; i++){//枚舉p件物品for(int j = 1;j <= v; j++){//枚舉背包容量if(j < c[i]){dp[i][j] = dp[i - 1][j];}else{if(x[i] == true)dp[i][j] = max(dp[i - 1][j],dp[i][j - c[i]] + w[i]);elsedp[i][j] = max(dp[i - 1][j],dp[i - 1][j - c[i]] + w[i]);}//else}//容量}//物品printf("%d\n",dp[p][v]);}return 0; }?
總結
以上是生活随笔為你收集整理的简单的一道题 背包问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创客更新装备 动态规划
- 下一篇: 系兄弟就来砍我 有向图单源最短路