問題描述:
有一個容量爲m(1<=m<=4000000)的揹包,有n(1<=n<=16)個物品,每個物品有體積v(1<=v<=2012)和價值w(0<=2012),現在要你選擇一些物品,使得揹包所裝物品的總價值最大。
Input
有多組測試數據,但是不會超過10組。
對於每組測試數據,第一行是兩個整數m和n,表示揹包容量的和物品個數。接下來有n行,每行有兩個整數,表示一個物品的體積和價值。
輸入到文件結束。
Output
對於每組測試數據,輸出一行,包含一個整數,爲揹包能裝下物品的最大價值。
Sample Input
10 3
6 9
5 5
5 5
3 2
1 2
2 1
Sample Output
10
3
作者:何知令
有一個容量爲m(1<=m<=4000000)的揹包,有n(1<=n<=16)個物品,每個物品有體積v(1<=v<=2012)和價值w(0<=2012),現在要你選擇一些物品,使得揹包所裝物品的總價值最大。
Input
有多組測試數據,但是不會超過10組。
對於每組測試數據,第一行是兩個整數m和n,表示揹包容量的和物品個數。接下來有n行,每行有兩個整數,表示一個物品的體積和價值。
輸入到文件結束。
Output
對於每組測試數據,輸出一行,包含一個整數,爲揹包能裝下物品的最大價值。
Sample Input
10 3
6 9
5 5
5 5
3 2
1 2
2 1
Sample Output
10
3
作者:何知令
完成時間:2017年8月21日
代碼如下:
/*
問題描述:
有一個容量爲m(1<=m<=4000000)的揹包,有n(1<=n<=16)個物品,每個物品有體積v(1<=v<=2012)和價值w(0<=2012),現在要你選擇一些物品,使得揹包所裝物品的總價值最大。
Input
有多組測試數據,但是不會超過10組。
對於每組測試數據,第一行是兩個整數m和n,表示揹包容量的和物品個數。接下來有n行,每行有兩個整數,表示一個物品的體積和價值。
輸入到文件結束。
Output
對於每組測試數據,輸出一行,包含一個整數,爲揹包能裝下物品的最大價值。
Sample Input
10 3
6 9
5 5
5 5
3 2
1 2
2 1
Sample Output
10
3
作者:何知令
完成時間:2017年8月21日
*/
#include <stdio.h>
int V[100][100];
int n,m;//n爲物品數量,m爲揹包容量
int w[100],v[100];
void FindMax()//動態規劃
{
int i,j;
//填表
for(i=0; i<=n; i++)
{
for(j=0; j<=m; j++)
{
if(j<w[i])//包裝不進
{
V[i][j]=V[i-1][j];
}
else//能裝
{
if(V[i-1][j]>V[i-1][j-w[i]]+v[i])//不裝價值大
{
V[i][j]=V[i-1][j];
}
else//前i-1個物品的最優解與第i個物品的價值之和更大
{
V[i][j]=V[i-1][j-w[i]]+v[i];
}
}
}
}
printf("%d\n",V[n][m]);
}
int main()
{
int i,j;
while(~scanf("%d %d",&m,&n))
{
for(i=0; i<m; i++)
for(j=0; j<m; j++)
V[i][j]=0;
for(i=0; i<n; i++)
scanf("%d %d",&w[i],&v[i]);
FindMax();
}
return 0;
}
知識點總結:動態規劃,揹包問題
學習心得:又是好久沒發博客了