简单的一道题 背包问题
生活随笔
收集整理的这篇文章主要介绍了
简单的一道题 背包问题
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
简单的一道题
时间限制: 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; }
总结
以上是生活随笔为你收集整理的简单的一道题 背包问题的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 创客更新装备 动态规划
- 下一篇: 系兄弟就来砍我 有向图单源最短路