每年做一次完全背包,累加结果#include<stdio.h>#include<string.h>int dp[1000000],w[11],v[11];int sum,n,y;int max(int a,int b){return a>b?a:b;}void DP(){ int i,j,V=sum/1000; for(i=0;i<=V;i++) dp[i]=0; for(i=0;i<n;i++) for(j=w[i];j<=V;j++) dp[j]=max(dp[j],dp[j-w[i]]+v[i]); sum+=dp[V];}int main Read More
看了别人的,就不讲了#include<stdio.h>#include<string.h>int dp[10000];int a[6];int min(int a,int b){ if(a==-1)return b; return a<b?a:b;}int main(){ int T; while(scanf("%d",&T)!=EOF) { while(T--){ int i,j; int upper = 0; for(i=0;i<6;i++) scanf("%d",&a[i]); upper= 10 Read More
完全背包,注意初始化的细节dp【0】=0;这道题要求的是恰好装满背包的最小的价值,所以初始状态下,只有dp[0]满足条件,即容量为0的背包可能被价值为0的东西(即木有东西)装满背包,其他容量的背包均没有合法解,都是无穷大,之所以是恰好装满是因为贮蓄罐的增重是一定的#include<stdio.h>#include<string.h>int dp[10000];int w[505],v[505];int min(int a,int b){return a<b?a:b;}int main(){ int t,e,f,i,j,k,n; scanf("%d&quo Read More
判断能不能将总的物品分两半,中间拆分的时候有点多重背包的思想#include<iostream>#include<string>#include<algorithm>using namespace std;int value[1005];int dp[60005];int num[7];int main(){ int i,j,d,ans,sum,ncase=1; while(scanf("%d%d%d%d%d%d",&num[1],&num[2],&num[3],&num[4],&num[5],&a Read More
三种背包,每组至少、至多取一个或随意取多少注释在代码中#include<cstdio>#include<cstring>int dp[110][110];int max(int a,int b){ return a>b?a:b;}int main(){ int n,T,i,j,k,m,s,w,v; while(scanf("%d%d",&n,&T)!=EOF) { memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%d%d",&m,& Read More
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。算法这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于第k组}使用一维数组的伪代码如下:for所有的组kfor v=V..0for所有的i属于组kf[v]=max{f[v],f[v-c[i]]+w[i] Read More