01背包(习题集)

题目列表及跳转请点击左上角的目录

hdu-2602-Bone Collector
code:
#include
#include
#include
#define maxn 1010
using namespace std;
int max(int a,int b)
{
	return a>b? a:b;
}
int main()
{
	int n,v,t,a[maxn],b[maxn],dp[maxn];
	cin>>t;
	while(t--){
		scanf("%d %d",&n,&v);
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		for(int i=1;i<=n;i++){
			scanf("%d",&b[i]);
		}
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++){
			for(int j=v;j>=b[i];j--){
				dp[j]=max(dp[j],dp[j-b[i]]+a[i]);
			}
		}
		printf("%d\n",dp[v]);
	}
	return 0;
}

poj-3642-Charm Bracelet

code:

#include
#include
#include
#define maxn 34100
using namespace std;
int max(int a,int b)
{
	return a>b? a:b;
}
int n,m,w[maxn],d[maxn],dp[maxn];
int main()
{
	while(cin>>n>>m){
		for(int i=1;i<=n;i++)
			scanf("%d %d",&w[i],&d[i]);
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++)
			for(int j=m;j>=w[i];j--)
				dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
		printf("%d\n",dp[m]);
	}
	return 0;
}
hdu-2546- 饭卡

code:

#include
#include
#include
#include
#define maxn 1005
using namespace std;
int max(int a,int b){
	return a>b? a:b;
}
int n,m,dp[maxn],val[maxn];
int main()
{
	while(~scanf("%d",&n),n){
		for(int i=1;i<=n;i++)
			scanf("%d",&val[i]);
		scanf("%d",&m);
		memset(dp,0,sizeof(dp));
		sort(val+1,val+n+1);
		if(m>=5){
			for(int i=1;i=val[i];j--)
					dp[j]=max(dp[j],dp[j-val[i]]+val[i]);
			}
			printf("%d\n",m-dp[m-5]-val[n]);
		}else {
			printf("%d\n",m);
		}
	}
	return 0;
}

UVa 624 CD 大致题意:

给你一张容量一定的CD,一些音乐的播放时间,问在每首曲子最多刻在CD上一次的情况下,CD上刻的音乐的播放时间和最长是多少。

code:

/* 
测试数据  

Sample Input : 
5 3 1 3 4
10 4 9 8 4 2
20 4 10 5 7 4
90 8 10 23 1 2 3 4 5 7
45 8 4 10 44 43 12 9 8 2

Sample Output :
1 4 sum:5
8 2 sum:10
10 5 4 sum:19
10 23 1 2 3 4 5 7 sum:55
4 10 12 9 8 2 sum:45
*/
#include   
#include   
using namespace std;  
  
const int N=10005;  
int volume[N];  
int dp[N];  
bool vis[25][N];  
  
int main()  
{  
    int n,V;  
    while(scanf("%d%d",&V,&n)!=EOF)  
    {  
        memset(volume,0,sizeof(volume)); //input  
        memset(dp,0,sizeof(dp));  
        memset(vis,0,sizeof(vis));     // vis true or not  
        for(int i=0; i=volume[i]; --v)  
            {  
                if(dp[v]<=dp[v-volume[i]]+volume[i]) // !=  
                {  
                    dp[v]=dp[v-volume[i]]+volume[i];  
                    vis[i][v]=1; //vis true  
                }  
            }  
        }  
        for(int i=n-1,j=V; i>=0; i--)  
        {  
            if(vis[i][j]) // if vis true,print the number  
            {  
                printf("%d ",volume[i]);  
                j-=volume[i];  
            }  
        }  
        printf("sum:%d\n",dp[V]);  
    }  
    return 0;  
}  

hdu-1171

code:

#include
#include
#include
using namespace std;
const int maxn = 101000;
int dp[maxn],v[maxn],m;
int main()
{
    //int n;
    while(scanf("%d",&m),m>0){
        memset(dp,0,sizeof(dp));
        memset(v,0,sizeof(v));
        int n=0,x,y,sum=0;
        for(int i=0;i=v[i];j--){
                dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
            }
        }
        printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);


    }
    return 0;
} 

未完待续。。

你可能感兴趣的:(acm_知识点总结)